/*
 * shaderTrain stylesheet — reveal.js theme overrides + exercise UI.
 * Layered on top of reveal.js/theme/black.css (imported before this in script.js).
 * ported from test_presentJS/res/thuy.css (gainsboro/navy branding)
 */

/*
 * Font faces and the vi/en language tokens live in src/fonts.css, loaded before
 * this file on every page (lectures/k12/teacher need the fonts without the deck
 * theme). Only --r-main-font-size and the non-font tokens are set here.
 */

:root {
  --r-background-color:           gainsboro;
  --r-main-font-size:             36px;
  --r-main-color:                 navy;
  --r-block-margin:               20px;
  --r-heading-margin:             0 0 20px 0;
  --r-heading-color:              navy;
  --r-heading-line-height:        1.2;
  --r-heading-letter-spacing:     normal;
  --r-heading-text-shadow:        none;
  --r-heading-font-weight:        bold;
  --r-heading1-text-shadow:       none;
  --r-heading1-size:              2.2em;
  --r-heading2-size:              1.6em;
  --r-heading3-size:              1.2em;
  --r-heading4-size:              1em;
  --r-code-font:                  monospace;
  --r-link-color:                 blue;
  --r-link-color-dark:            rgb(20, 155, 249);
  --r-link-color-hover:           rgb(94, 187, 251);
  --r-selection-background-color: rgba(66, 175, 250, 0.75);
  --r-selection-color:            #fff;
}

html {
  /* fallback so the page isn't briefly white before reveal-viewport paints */
  background-color: var(--r-background-color);
}

.reveal-viewport {
  background-color: var(--r-background-color);
}

.reveal {
  font-family: var(--r-main-font);
  color: var(--r-main-color);
  position: relative;
  z-index: 1;
}

/*
 * bgShader.js (src/bgShader.js): toggled on body when the current slide opts in via
 * <!-- .slide: data-bg-shader --> in content.md. #bgShaderCanvas sits at z-index:0,
 * behind .reveal -- only visible once the flat background color is removed here.
 */
body.bg-shader-on.reveal-viewport,
body.bg-shader-on .reveal-viewport {
  background-color: transparent;
}

/*
 * Elements matched by a slide's data-bg-shader-text selector: bgShader.js overlays a
 * canvas (class bg-shader-mask-canvas, z-index:2) clipped to this element's own glyph
 * shapes with the shader's pixels. Layout/selection/screen-reader text is untouched --
 * only the paint is hidden.
 *
 * ".reveal h1"-style theme rules (element+class, specificity 0,1,1) outrank a bare
 * ".bg-shader-masked" (0,1,0) regardless of source order, so this needs ".reveal" in
 * front of it to actually win.
 */
.reveal .bg-shader-masked {
  color: transparent;
}

/*
 * The generic "canvas" rule below adds a navy border/padding/radius meant for demo
 * canvases embedded in slide content -- bgShader.js's own canvases are full-bleed
 * background/overlay layers, not slide content, so opt back out of it here.
 */
#bgShaderCanvas,
.bg-shader-mask-canvas {
  border: none;
  padding: 0;
  border-radius: 0;
  box-sizing: content-box;
}

/* Not a hardcoded family: h1 follows the same language switch as everything else,
   so an English slide's heading comes out in Futura ExtraBold as it always did. */
.reveal h1 {
  font-family: var(--k12-h1-font);
}

/*
 * Reveal's slide canvas is a fixed 1920x1080px box (scaled via CSS transform,
 * not viewport units), so percentage image sizes (width:50%) resolve against
 * that 1920px width and can blow past the 1080px height for tall/portrait
 * images. Clamp with a fixed px max-height as a fallback; content.md should
 * still prefer explicit px width/height per image.
 */
.reveal .slides section img,
.reveal .slides section video {
  max-height: 1024px;
  width: auto;
  image-rendering: pixelated;
  image-rendering: -moz-crisp-edges;
  image-rendering: crisp-edges;
}

textarea {
  font-family: consolas;
  font-style: normal;
  background-color: transparent;
  font-size: 16px;
  outline: none;
}
/* The orange/rounded button styling that used to live here was a leftover from
   the shader course and, loading after 98.css, overrode its silver bevelled
   chrome on every button in the deck. Buttons now take the Win98 look from
   98.css; only sizing is adjusted (see win98_overrides.css), because the deck is
   a 1920x1080 canvas scaled to fit and 98.css's 11px would be unreadable. */
img {
  border-radius: 20px;
  padding: 10px;
  box-sizing: border-box;
}
canvas {
  border-radius: 20px;
  padding: 10px;
  border: 2px solid navy;
  box-sizing: border-box;
}
math {
  font-size: 32px;
}
#btn_load {
  background-color: cyan;
}
#btn_save {
  background-color: cyan;
}
.utils {
  bottom: 22px;
  right: 22px;
  position: fixed;
}
.ex-media {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 20px;
}
.ex-media img,
.ex-media canvas {
  width:  400px;
  height: 400px;
}
.ex-question {
  width:50%;
  text-align: left;
  line-height: 1.4;
}

/*
 * Interactive exercise embedded in a lecture slide (see lectureExercise.js). The
 * widgets are the same ones the standalone k12 page runs, so they draw their own
 * canvas -- this only lays out the three regions and gives the controls a size
 * that's legible at slide scale (the deck is a 1920x1080 canvas, so 16px UI text
 * ends up tiny once it's scaled to fit a window).
 */
.k12-exercise {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
}
.k12-ex-controls {
  display: flex;
  gap: 14px;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  font-size: 28px;
}
.k12-ex-controls input[type=number] {
  width: 120px;
  font-size: 28px;
  padding: 6px;
}
.k12-ex-controls input[type=range] {
  width: 220px;
}
/*
 * Dialogue slide (see lectureDialogue.js): a character speaking, dressed as a
 * 98.css window with the speaker's name in the title bar. Sized for slide space
 * -- the deck is a 1920x1080 canvas scaled to fit, so 98.css's own 11px chrome
 * would be unreadable here.
 */
.k12-dialogue-window {
  max-width: 1400px;
  margin: 0 auto;
  text-align: left;
}
.k12-dialogue-window .title-bar-text {
  font-size: 26px;
}
.k12-dialogue-window .title-bar {
  padding: 8px 6px 8px 10px;
}
.k12-dialogue-body {
  display: flex;
  align-items: flex-start;
  gap: 24px;
  margin: 16px;
}
.k12-dialogue-portrait {
  width: 160px;
  height: auto;
  flex-shrink: 0;
  border-radius: 0;
  padding: 0;
  image-rendering: pixelated;
}
.k12-dialogue-line {
  flex: 1;
  font-size: 34px;
  line-height: 1.45;
  color: #222;
}

.k12-practice-hint {
  margin-top: 40px;
  font-size: 30px;
  color: #7a5c00;
  background: #fff7e0;
  border: 1px solid #e5cf8a;
  border-radius: 10px;
  padding: 16px 26px;
  display: inline-block;
}
.k12-ex-feedback {
  font-size: 30px;
  font-weight: 600;
  min-height: 40px;
}

/*
 * Worked-solution block gated by lectureSolution.js. Only the CONTENT is hidden --
 * the lock note stays visible so the learner knows what to do to open it, rather
 * than the slide just appearing empty.
 */
.k12-solution-locked > *:not(.k12-solution-note) {
  display: none;
}
/* An UNLOCKED block empties this note but keeps the element (lectureSolution.js
   sets textContent = "" rather than removing it, so a later re-lock can refill
   it). Empty, it was still a bordered, padded, centre-aligned box sitting above
   left-aligned solution text -- which reads exactly as a layout bug and is why
   a teacher sees one and a learner does not. */
.k12-solution-note:empty { display: none; }

.k12-solution-note {
  font-size: 28px;
  color: #7a5c00;
  background: #fff7e0;
  border: 1px solid #e5cf8a;
  border-radius: 8px;
  padding: 14px 18px;
  margin: 0 auto;
  max-width: 1200px;
}

/*
 * Landing page menu (index.html / home.js). Sized for slide space -- the deck is a
 * 1920x1080 canvas scaled to fit, so ordinary UI sizes come out tiny.
 */
#homeMenu {
  display: flex;
  gap: 24px;
  justify-content: center;
  flex-wrap: wrap;
  margin-top: 60px;
}
/* The look is the theme's one button rule (theme_anhungxadieu.css), which takes
   the <a> entry as well as the <button>: styled apart, the link kept 98.css's
   silver next to a wooden plank. Only the slide-scale sizing is set here, and
   the <a> is given a button's box. */
.home-btn {
  display: inline-block;
  font-family: var(--r-heading-font), "Pixelated MS Sans Serif", Arial;
  font-size: 30px;
  text-decoration: none;
}
#homeUser {
  text-align: center;
  color: whitesmoke;
  font-size: 24px;
  margin-top: 24px;
  min-height: 30px;
}

.tt-term {
  border-bottom: 2px dashed navy;
  cursor: help;
}
.tt-term[data-href] {
  cursor: pointer;
}

/*
 * Single shared floating tooltip (see _setup_tooltips in script.js). Lives outside
 * the scaled .reveal .slides transform, so sizes here are real screen px, not
 * slide-space px like the rest of this stylesheet.
 */
#tooltip-float {
  display: none;
  position: fixed;
  z-index: 9999;
  max-width: 480px;
  background: #1e1e1e;
  color: #d4d4d4;
  border: 1px solid #666;
  border-radius: 6px;
  padding: 12px 16px;
  font-family: Thuy_serif;
  font-size: 20px;
  line-height: 1.3;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
  pointer-events: none;
}
#tooltip-float img {
  max-width: 440px;
  max-height: 320px;
  display: block;
  margin: 0 auto;
}
#tooltip-float iframe {
  border: none;
  display: block;
}

/*# sourceURL=webpack://./src/style.css */
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8uL3NyYy9zdHlsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7RUFJRTs7QUFFRjs7OztFQUlFOztBQUVGO0VBQ0UseUNBQXlDO0VBQ3pDLG9DQUFvQztFQUNwQyxvQ0FBb0M7RUFDcEMsb0NBQW9DO0VBQ3BDLDBDQUEwQztFQUMxQyxvQ0FBb0M7RUFDcEMsbUNBQW1DO0VBQ25DLHNDQUFzQztFQUN0QyxvQ0FBb0M7RUFDcEMsb0NBQW9DO0VBQ3BDLG9DQUFvQztFQUNwQyxxQ0FBcUM7RUFDckMscUNBQXFDO0VBQ3JDLHFDQUFxQztFQUNyQyxtQ0FBbUM7RUFDbkMseUNBQXlDO0VBQ3pDLG9DQUFvQztFQUNwQyxpREFBaUQ7RUFDakQsaURBQWlEO0VBQ2pELHdEQUF3RDtFQUN4RCxvQ0FBb0M7QUFDdEM7O0FBRUE7RUFDRSwyRUFBMkU7RUFDM0UsMkNBQTJDO0FBQzdDOztBQUVBO0VBQ0UsMkNBQTJDO0FBQzdDOztBQUVBO0VBQ0UsK0JBQStCO0VBQy9CLDBCQUEwQjtFQUMxQixrQkFBa0I7RUFDbEIsVUFBVTtBQUNaOztBQUVBOzs7O0VBSUU7QUFDRjs7RUFFRSw2QkFBNkI7QUFDL0I7O0FBRUE7Ozs7Ozs7OztFQVNFO0FBQ0Y7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7Ozs7RUFJRTtBQUNGOztFQUVFLFlBQVk7RUFDWixVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLHVCQUF1QjtBQUN6Qjs7QUFFQTtrRkFDa0Y7QUFDbEY7RUFDRSwrQkFBK0I7QUFDakM7O0FBRUE7Ozs7OztFQU1FO0FBQ0Y7O0VBRUUsa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCwwQkFBMEI7RUFDMUIsaUNBQWlDO0VBQ2pDLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixrQkFBa0I7RUFDbEIsNkJBQTZCO0VBQzdCLGVBQWU7RUFDZixhQUFhO0FBQ2Y7QUFDQTs7Ozs0RUFJNEU7QUFDNUU7RUFDRSxtQkFBbUI7RUFDbkIsYUFBYTtFQUNiLHNCQUFzQjtBQUN4QjtBQUNBO0VBQ0UsbUJBQW1CO0VBQ25CLGFBQWE7RUFDYixzQkFBc0I7RUFDdEIsc0JBQXNCO0FBQ3hCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxzQkFBc0I7QUFDeEI7QUFDQTtFQUNFLHNCQUFzQjtBQUN4QjtBQUNBO0VBQ0UsWUFBWTtFQUNaLFdBQVc7RUFDWCxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixTQUFTO0FBQ1g7QUFDQTs7RUFFRSxhQUFhO0VBQ2IsYUFBYTtBQUNmO0FBQ0E7RUFDRSxTQUFTO0VBQ1QsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtBQUNsQjs7QUFFQTs7Ozs7O0VBTUU7QUFDRjtFQUNFLGFBQWE7RUFDYixzQkFBc0I7RUFDdEIsbUJBQW1CO0VBQ25CLFNBQVM7QUFDWDtBQUNBO0VBQ0UsYUFBYTtFQUNiLFNBQVM7RUFDVCxtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLHVCQUF1QjtFQUN2QixlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxZQUFZO0VBQ1osZUFBZTtFQUNmLFlBQVk7QUFDZDtBQUNBO0VBQ0UsWUFBWTtBQUNkO0FBQ0E7Ozs7O0VBS0U7QUFDRjtFQUNFLGlCQUFpQjtFQUNqQixjQUFjO0VBQ2QsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSx5QkFBeUI7QUFDM0I7QUFDQTtFQUNFLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsU0FBUztFQUNULFlBQVk7QUFDZDtBQUNBO0VBQ0UsWUFBWTtFQUNaLFlBQVk7RUFDWixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDViwwQkFBMEI7QUFDNUI7QUFDQTtFQUNFLE9BQU87RUFDUCxlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsY0FBYztFQUNkLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQixxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0FBQ2xCOztBQUVBOzs7O0VBSUU7QUFDRjtFQUNFLGFBQWE7QUFDZjtBQUNBOzs7OytDQUkrQztBQUMvQywyQkFBMkIsYUFBYSxFQUFFOztBQUUxQztFQUNFLGVBQWU7RUFDZixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGNBQWM7RUFDZCxpQkFBaUI7QUFDbkI7O0FBRUE7OztFQUdFO0FBQ0Y7RUFDRSxhQUFhO0VBQ2IsU0FBUztFQUNULHVCQUF1QjtFQUN2QixlQUFlO0VBQ2YsZ0JBQWdCO0FBQ2xCO0FBQ0E7OztxQ0FHcUM7QUFDckM7RUFDRSxxQkFBcUI7RUFDckIsb0VBQW9FO0VBQ3BFLGVBQWU7RUFDZixxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSw4QkFBOEI7RUFDOUIsWUFBWTtBQUNkO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCOztBQUVBOzs7O0VBSUU7QUFDRjtFQUNFLGFBQWE7RUFDYixlQUFlO0VBQ2YsYUFBYTtFQUNiLGdCQUFnQjtFQUNoQixtQkFBbUI7RUFDbkIsY0FBYztFQUNkLHNCQUFzQjtFQUN0QixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLHlDQUF5QztFQUN6QyxvQkFBb0I7QUFDdEI7QUFDQTtFQUNFLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIsY0FBYztFQUNkLGNBQWM7QUFDaEI7QUFDQTtFQUNFLFlBQVk7RUFDWixjQUFjO0FBQ2hCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIHNoYWRlclRyYWluIHN0eWxlc2hlZXQg4oCUIHJldmVhbC5qcyB0aGVtZSBvdmVycmlkZXMgKyBleGVyY2lzZSBVSS5cbiAqIExheWVyZWQgb24gdG9wIG9mIHJldmVhbC5qcy90aGVtZS9ibGFjay5jc3MgKGltcG9ydGVkIGJlZm9yZSB0aGlzIGluIHNjcmlwdC5qcykuXG4gKiBwb3J0ZWQgZnJvbSB0ZXN0X3ByZXNlbnRKUy9yZXMvdGh1eS5jc3MgKGdhaW5zYm9yby9uYXZ5IGJyYW5kaW5nKVxuICovXG5cbi8qXG4gKiBGb250IGZhY2VzIGFuZCB0aGUgdmkvZW4gbGFuZ3VhZ2UgdG9rZW5zIGxpdmUgaW4gc3JjL2ZvbnRzLmNzcywgbG9hZGVkIGJlZm9yZVxuICogdGhpcyBmaWxlIG9uIGV2ZXJ5IHBhZ2UgKGxlY3R1cmVzL2sxMi90ZWFjaGVyIG5lZWQgdGhlIGZvbnRzIHdpdGhvdXQgdGhlIGRlY2tcbiAqIHRoZW1lKS4gT25seSAtLXItbWFpbi1mb250LXNpemUgYW5kIHRoZSBub24tZm9udCB0b2tlbnMgYXJlIHNldCBoZXJlLlxuICovXG5cbjpyb290IHtcbiAgLS1yLWJhY2tncm91bmQtY29sb3I6ICAgICAgICAgICBnYWluc2Jvcm87XG4gIC0tci1tYWluLWZvbnQtc2l6ZTogICAgICAgICAgICAgMzZweDtcbiAgLS1yLW1haW4tY29sb3I6ICAgICAgICAgICAgICAgICBuYXZ5O1xuICAtLXItYmxvY2stbWFyZ2luOiAgICAgICAgICAgICAgIDIwcHg7XG4gIC0tci1oZWFkaW5nLW1hcmdpbjogICAgICAgICAgICAgMCAwIDIwcHggMDtcbiAgLS1yLWhlYWRpbmctY29sb3I6ICAgICAgICAgICAgICBuYXZ5O1xuICAtLXItaGVhZGluZy1saW5lLWhlaWdodDogICAgICAgIDEuMjtcbiAgLS1yLWhlYWRpbmctbGV0dGVyLXNwYWNpbmc6ICAgICBub3JtYWw7XG4gIC0tci1oZWFkaW5nLXRleHQtc2hhZG93OiAgICAgICAgbm9uZTtcbiAgLS1yLWhlYWRpbmctZm9udC13ZWlnaHQ6ICAgICAgICBib2xkO1xuICAtLXItaGVhZGluZzEtdGV4dC1zaGFkb3c6ICAgICAgIG5vbmU7XG4gIC0tci1oZWFkaW5nMS1zaXplOiAgICAgICAgICAgICAgMi4yZW07XG4gIC0tci1oZWFkaW5nMi1zaXplOiAgICAgICAgICAgICAgMS42ZW07XG4gIC0tci1oZWFkaW5nMy1zaXplOiAgICAgICAgICAgICAgMS4yZW07XG4gIC0tci1oZWFkaW5nNC1zaXplOiAgICAgICAgICAgICAgMWVtO1xuICAtLXItY29kZS1mb250OiAgICAgICAgICAgICAgICAgIG1vbm9zcGFjZTtcbiAgLS1yLWxpbmstY29sb3I6ICAgICAgICAgICAgICAgICBibHVlO1xuICAtLXItbGluay1jb2xvci1kYXJrOiAgICAgICAgICAgIHJnYigyMCwgMTU1LCAyNDkpO1xuICAtLXItbGluay1jb2xvci1ob3ZlcjogICAgICAgICAgIHJnYig5NCwgMTg3LCAyNTEpO1xuICAtLXItc2VsZWN0aW9uLWJhY2tncm91bmQtY29sb3I6IHJnYmEoNjYsIDE3NSwgMjUwLCAwLjc1KTtcbiAgLS1yLXNlbGVjdGlvbi1jb2xvcjogICAgICAgICAgICAjZmZmO1xufVxuXG5odG1sIHtcbiAgLyogZmFsbGJhY2sgc28gdGhlIHBhZ2UgaXNuJ3QgYnJpZWZseSB3aGl0ZSBiZWZvcmUgcmV2ZWFsLXZpZXdwb3J0IHBhaW50cyAqL1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1yLWJhY2tncm91bmQtY29sb3IpO1xufVxuXG4ucmV2ZWFsLXZpZXdwb3J0IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tci1iYWNrZ3JvdW5kLWNvbG9yKTtcbn1cblxuLnJldmVhbCB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1yLW1haW4tZm9udCk7XG4gIGNvbG9yOiB2YXIoLS1yLW1haW4tY29sb3IpO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG59XG5cbi8qXG4gKiBiZ1NoYWRlci5qcyAoc3JjL2JnU2hhZGVyLmpzKTogdG9nZ2xlZCBvbiBib2R5IHdoZW4gdGhlIGN1cnJlbnQgc2xpZGUgb3B0cyBpbiB2aWFcbiAqIDwhLS0gLnNsaWRlOiBkYXRhLWJnLXNoYWRlciAtLT4gaW4gY29udGVudC5tZC4gI2JnU2hhZGVyQ2FudmFzIHNpdHMgYXQgei1pbmRleDowLFxuICogYmVoaW5kIC5yZXZlYWwgLS0gb25seSB2aXNpYmxlIG9uY2UgdGhlIGZsYXQgYmFja2dyb3VuZCBjb2xvciBpcyByZW1vdmVkIGhlcmUuXG4gKi9cbmJvZHkuYmctc2hhZGVyLW9uLnJldmVhbC12aWV3cG9ydCxcbmJvZHkuYmctc2hhZGVyLW9uIC5yZXZlYWwtdmlld3BvcnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLypcbiAqIEVsZW1lbnRzIG1hdGNoZWQgYnkgYSBzbGlkZSdzIGRhdGEtYmctc2hhZGVyLXRleHQgc2VsZWN0b3I6IGJnU2hhZGVyLmpzIG92ZXJsYXlzIGFcbiAqIGNhbnZhcyAoY2xhc3MgYmctc2hhZGVyLW1hc2stY2FudmFzLCB6LWluZGV4OjIpIGNsaXBwZWQgdG8gdGhpcyBlbGVtZW50J3Mgb3duIGdseXBoXG4gKiBzaGFwZXMgd2l0aCB0aGUgc2hhZGVyJ3MgcGl4ZWxzLiBMYXlvdXQvc2VsZWN0aW9uL3NjcmVlbi1yZWFkZXIgdGV4dCBpcyB1bnRvdWNoZWQgLS1cbiAqIG9ubHkgdGhlIHBhaW50IGlzIGhpZGRlbi5cbiAqXG4gKiBcIi5yZXZlYWwgaDFcIi1zdHlsZSB0aGVtZSBydWxlcyAoZWxlbWVudCtjbGFzcywgc3BlY2lmaWNpdHkgMCwxLDEpIG91dHJhbmsgYSBiYXJlXG4gKiBcIi5iZy1zaGFkZXItbWFza2VkXCIgKDAsMSwwKSByZWdhcmRsZXNzIG9mIHNvdXJjZSBvcmRlciwgc28gdGhpcyBuZWVkcyBcIi5yZXZlYWxcIiBpblxuICogZnJvbnQgb2YgaXQgdG8gYWN0dWFsbHkgd2luLlxuICovXG4ucmV2ZWFsIC5iZy1zaGFkZXItbWFza2VkIHtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4vKlxuICogVGhlIGdlbmVyaWMgXCJjYW52YXNcIiBydWxlIGJlbG93IGFkZHMgYSBuYXZ5IGJvcmRlci9wYWRkaW5nL3JhZGl1cyBtZWFudCBmb3IgZGVtb1xuICogY2FudmFzZXMgZW1iZWRkZWQgaW4gc2xpZGUgY29udGVudCAtLSBiZ1NoYWRlci5qcydzIG93biBjYW52YXNlcyBhcmUgZnVsbC1ibGVlZFxuICogYmFja2dyb3VuZC9vdmVybGF5IGxheWVycywgbm90IHNsaWRlIGNvbnRlbnQsIHNvIG9wdCBiYWNrIG91dCBvZiBpdCBoZXJlLlxuICovXG4jYmdTaGFkZXJDYW52YXMsXG4uYmctc2hhZGVyLW1hc2stY2FudmFzIHtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXItcmFkaXVzOiAwO1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cblxuLyogTm90IGEgaGFyZGNvZGVkIGZhbWlseTogaDEgZm9sbG93cyB0aGUgc2FtZSBsYW5ndWFnZSBzd2l0Y2ggYXMgZXZlcnl0aGluZyBlbHNlLFxuICAgc28gYW4gRW5nbGlzaCBzbGlkZSdzIGhlYWRpbmcgY29tZXMgb3V0IGluIEZ1dHVyYSBFeHRyYUJvbGQgYXMgaXQgYWx3YXlzIGRpZC4gKi9cbi5yZXZlYWwgaDEge1xuICBmb250LWZhbWlseTogdmFyKC0tazEyLWgxLWZvbnQpO1xufVxuXG4vKlxuICogUmV2ZWFsJ3Mgc2xpZGUgY2FudmFzIGlzIGEgZml4ZWQgMTkyMHgxMDgwcHggYm94IChzY2FsZWQgdmlhIENTUyB0cmFuc2Zvcm0sXG4gKiBub3Qgdmlld3BvcnQgdW5pdHMpLCBzbyBwZXJjZW50YWdlIGltYWdlIHNpemVzICh3aWR0aDo1MCUpIHJlc29sdmUgYWdhaW5zdFxuICogdGhhdCAxOTIwcHggd2lkdGggYW5kIGNhbiBibG93IHBhc3QgdGhlIDEwODBweCBoZWlnaHQgZm9yIHRhbGwvcG9ydHJhaXRcbiAqIGltYWdlcy4gQ2xhbXAgd2l0aCBhIGZpeGVkIHB4IG1heC1oZWlnaHQgYXMgYSBmYWxsYmFjazsgY29udGVudC5tZCBzaG91bGRcbiAqIHN0aWxsIHByZWZlciBleHBsaWNpdCBweCB3aWR0aC9oZWlnaHQgcGVyIGltYWdlLlxuICovXG4ucmV2ZWFsIC5zbGlkZXMgc2VjdGlvbiBpbWcsXG4ucmV2ZWFsIC5zbGlkZXMgc2VjdGlvbiB2aWRlbyB7XG4gIG1heC1oZWlnaHQ6IDEwMjRweDtcbiAgd2lkdGg6IGF1dG87XG4gIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1xuICBpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7XG4gIGltYWdlLXJlbmRlcmluZzogY3Jpc3AtZWRnZXM7XG59XG5cbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGNvbnNvbGFzO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBmb250LXNpemU6IDE2cHg7XG4gIG91dGxpbmU6IG5vbmU7XG59XG4vKiBUaGUgb3JhbmdlL3JvdW5kZWQgYnV0dG9uIHN0eWxpbmcgdGhhdCB1c2VkIHRvIGxpdmUgaGVyZSB3YXMgYSBsZWZ0b3ZlciBmcm9tXG4gICB0aGUgc2hhZGVyIGNvdXJzZSBhbmQsIGxvYWRpbmcgYWZ0ZXIgOTguY3NzLCBvdmVycm9kZSBpdHMgc2lsdmVyIGJldmVsbGVkXG4gICBjaHJvbWUgb24gZXZlcnkgYnV0dG9uIGluIHRoZSBkZWNrLiBCdXR0b25zIG5vdyB0YWtlIHRoZSBXaW45OCBsb29rIGZyb21cbiAgIDk4LmNzczsgb25seSBzaXppbmcgaXMgYWRqdXN0ZWQgKHNlZSB3aW45OF9vdmVycmlkZXMuY3NzKSwgYmVjYXVzZSB0aGUgZGVjayBpc1xuICAgYSAxOTIweDEwODAgY2FudmFzIHNjYWxlZCB0byBmaXQgYW5kIDk4LmNzcydzIDExcHggd291bGQgYmUgdW5yZWFkYWJsZS4gKi9cbmltZyB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gIHBhZGRpbmc6IDEwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5jYW52YXMge1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICBwYWRkaW5nOiAxMHB4O1xuICBib3JkZXI6IDJweCBzb2xpZCBuYXZ5O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxubWF0aCB7XG4gIGZvbnQtc2l6ZTogMzJweDtcbn1cbiNidG5fbG9hZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGN5YW47XG59XG4jYnRuX3NhdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjeWFuO1xufVxuLnV0aWxzIHtcbiAgYm90dG9tOiAyMnB4O1xuICByaWdodDogMjJweDtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLmV4LW1lZGlhIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMjBweDtcbn1cbi5leC1tZWRpYSBpbWcsXG4uZXgtbWVkaWEgY2FudmFzIHtcbiAgd2lkdGg6ICA0MDBweDtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5leC1xdWVzdGlvbiB7XG4gIHdpZHRoOjUwJTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbn1cblxuLypcbiAqIEludGVyYWN0aXZlIGV4ZXJjaXNlIGVtYmVkZGVkIGluIGEgbGVjdHVyZSBzbGlkZSAoc2VlIGxlY3R1cmVFeGVyY2lzZS5qcykuIFRoZVxuICogd2lkZ2V0cyBhcmUgdGhlIHNhbWUgb25lcyB0aGUgc3RhbmRhbG9uZSBrMTIgcGFnZSBydW5zLCBzbyB0aGV5IGRyYXcgdGhlaXIgb3duXG4gKiBjYW52YXMgLS0gdGhpcyBvbmx5IGxheXMgb3V0IHRoZSB0aHJlZSByZWdpb25zIGFuZCBnaXZlcyB0aGUgY29udHJvbHMgYSBzaXplXG4gKiB0aGF0J3MgbGVnaWJsZSBhdCBzbGlkZSBzY2FsZSAodGhlIGRlY2sgaXMgYSAxOTIweDEwODAgY2FudmFzLCBzbyAxNnB4IFVJIHRleHRcbiAqIGVuZHMgdXAgdGlueSBvbmNlIGl0J3Mgc2NhbGVkIHRvIGZpdCBhIHdpbmRvdykuXG4gKi9cbi5rMTItZXhlcmNpc2Uge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDE2cHg7XG59XG4uazEyLWV4LWNvbnRyb2xzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAxNHB4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBmb250LXNpemU6IDI4cHg7XG59XG4uazEyLWV4LWNvbnRyb2xzIGlucHV0W3R5cGU9bnVtYmVyXSB7XG4gIHdpZHRoOiAxMjBweDtcbiAgZm9udC1zaXplOiAyOHB4O1xuICBwYWRkaW5nOiA2cHg7XG59XG4uazEyLWV4LWNvbnRyb2xzIGlucHV0W3R5cGU9cmFuZ2VdIHtcbiAgd2lkdGg6IDIyMHB4O1xufVxuLypcbiAqIERpYWxvZ3VlIHNsaWRlIChzZWUgbGVjdHVyZURpYWxvZ3VlLmpzKTogYSBjaGFyYWN0ZXIgc3BlYWtpbmcsIGRyZXNzZWQgYXMgYVxuICogOTguY3NzIHdpbmRvdyB3aXRoIHRoZSBzcGVha2VyJ3MgbmFtZSBpbiB0aGUgdGl0bGUgYmFyLiBTaXplZCBmb3Igc2xpZGUgc3BhY2VcbiAqIC0tIHRoZSBkZWNrIGlzIGEgMTkyMHgxMDgwIGNhbnZhcyBzY2FsZWQgdG8gZml0LCBzbyA5OC5jc3MncyBvd24gMTFweCBjaHJvbWVcbiAqIHdvdWxkIGJlIHVucmVhZGFibGUgaGVyZS5cbiAqL1xuLmsxMi1kaWFsb2d1ZS13aW5kb3cge1xuICBtYXgtd2lkdGg6IDE0MDBweDtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4uazEyLWRpYWxvZ3VlLXdpbmRvdyAudGl0bGUtYmFyLXRleHQge1xuICBmb250LXNpemU6IDI2cHg7XG59XG4uazEyLWRpYWxvZ3VlLXdpbmRvdyAudGl0bGUtYmFyIHtcbiAgcGFkZGluZzogOHB4IDZweCA4cHggMTBweDtcbn1cbi5rMTItZGlhbG9ndWUtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBnYXA6IDI0cHg7XG4gIG1hcmdpbjogMTZweDtcbn1cbi5rMTItZGlhbG9ndWUtcG9ydHJhaXQge1xuICB3aWR0aDogMTYwcHg7XG4gIGhlaWdodDogYXV0bztcbiAgZmxleC1zaHJpbms6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1xufVxuLmsxMi1kaWFsb2d1ZS1saW5lIHtcbiAgZmxleDogMTtcbiAgZm9udC1zaXplOiAzNHB4O1xuICBsaW5lLWhlaWdodDogMS40NTtcbiAgY29sb3I6ICMyMjI7XG59XG5cbi5rMTItcHJhY3RpY2UtaGludCB7XG4gIG1hcmdpbi10b3A6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMzBweDtcbiAgY29sb3I6ICM3YTVjMDA7XG4gIGJhY2tncm91bmQ6ICNmZmY3ZTA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlNWNmOGE7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIHBhZGRpbmc6IDE2cHggMjZweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLmsxMi1leC1mZWVkYmFjayB7XG4gIGZvbnQtc2l6ZTogMzBweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbWluLWhlaWdodDogNDBweDtcbn1cblxuLypcbiAqIFdvcmtlZC1zb2x1dGlvbiBibG9jayBnYXRlZCBieSBsZWN0dXJlU29sdXRpb24uanMuIE9ubHkgdGhlIENPTlRFTlQgaXMgaGlkZGVuIC0tXG4gKiB0aGUgbG9jayBub3RlIHN0YXlzIHZpc2libGUgc28gdGhlIGxlYXJuZXIga25vd3Mgd2hhdCB0byBkbyB0byBvcGVuIGl0LCByYXRoZXJcbiAqIHRoYW4gdGhlIHNsaWRlIGp1c3QgYXBwZWFyaW5nIGVtcHR5LlxuICovXG4uazEyLXNvbHV0aW9uLWxvY2tlZCA+ICo6bm90KC5rMTItc29sdXRpb24tbm90ZSkge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogQW4gVU5MT0NLRUQgYmxvY2sgZW1wdGllcyB0aGlzIG5vdGUgYnV0IGtlZXBzIHRoZSBlbGVtZW50IChsZWN0dXJlU29sdXRpb24uanNcbiAgIHNldHMgdGV4dENvbnRlbnQgPSBcIlwiIHJhdGhlciB0aGFuIHJlbW92aW5nIGl0LCBzbyBhIGxhdGVyIHJlLWxvY2sgY2FuIHJlZmlsbFxuICAgaXQpLiBFbXB0eSwgaXQgd2FzIHN0aWxsIGEgYm9yZGVyZWQsIHBhZGRlZCwgY2VudHJlLWFsaWduZWQgYm94IHNpdHRpbmcgYWJvdmVcbiAgIGxlZnQtYWxpZ25lZCBzb2x1dGlvbiB0ZXh0IC0tIHdoaWNoIHJlYWRzIGV4YWN0bHkgYXMgYSBsYXlvdXQgYnVnIGFuZCBpcyB3aHlcbiAgIGEgdGVhY2hlciBzZWVzIG9uZSBhbmQgYSBsZWFybmVyIGRvZXMgbm90LiAqL1xuLmsxMi1zb2x1dGlvbi1ub3RlOmVtcHR5IHsgZGlzcGxheTogbm9uZTsgfVxuXG4uazEyLXNvbHV0aW9uLW5vdGUge1xuICBmb250LXNpemU6IDI4cHg7XG4gIGNvbG9yOiAjN2E1YzAwO1xuICBiYWNrZ3JvdW5kOiAjZmZmN2UwO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZTVjZjhhO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIHBhZGRpbmc6IDE0cHggMThweDtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG1heC13aWR0aDogMTIwMHB4O1xufVxuXG4vKlxuICogTGFuZGluZyBwYWdlIG1lbnUgKGluZGV4Lmh0bWwgLyBob21lLmpzKS4gU2l6ZWQgZm9yIHNsaWRlIHNwYWNlIC0tIHRoZSBkZWNrIGlzIGFcbiAqIDE5MjB4MTA4MCBjYW52YXMgc2NhbGVkIHRvIGZpdCwgc28gb3JkaW5hcnkgVUkgc2l6ZXMgY29tZSBvdXQgdGlueS5cbiAqL1xuI2hvbWVNZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAyNHB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBtYXJnaW4tdG9wOiA2MHB4O1xufVxuLyogVGhlIGxvb2sgaXMgdGhlIHRoZW1lJ3Mgb25lIGJ1dHRvbiBydWxlICh0aGVtZV9hbmh1bmd4YWRpZXUuY3NzKSwgd2hpY2ggdGFrZXNcbiAgIHRoZSA8YT4gZW50cnkgYXMgd2VsbCBhcyB0aGUgPGJ1dHRvbj46IHN0eWxlZCBhcGFydCwgdGhlIGxpbmsga2VwdCA5OC5jc3Mnc1xuICAgc2lsdmVyIG5leHQgdG8gYSB3b29kZW4gcGxhbmsuIE9ubHkgdGhlIHNsaWRlLXNjYWxlIHNpemluZyBpcyBzZXQgaGVyZSwgYW5kXG4gICB0aGUgPGE+IGlzIGdpdmVuIGEgYnV0dG9uJ3MgYm94LiAqL1xuLmhvbWUtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogdmFyKC0tci1oZWFkaW5nLWZvbnQpLCBcIlBpeGVsYXRlZCBNUyBTYW5zIFNlcmlmXCIsIEFyaWFsO1xuICBmb250LXNpemU6IDMwcHg7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbiNob21lVXNlciB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6IHdoaXRlc21va2U7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgbWFyZ2luLXRvcDogMjRweDtcbiAgbWluLWhlaWdodDogMzBweDtcbn1cblxuLnR0LXRlcm0ge1xuICBib3JkZXItYm90dG9tOiAycHggZGFzaGVkIG5hdnk7XG4gIGN1cnNvcjogaGVscDtcbn1cbi50dC10ZXJtW2RhdGEtaHJlZl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qXG4gKiBTaW5nbGUgc2hhcmVkIGZsb2F0aW5nIHRvb2x0aXAgKHNlZSBfc2V0dXBfdG9vbHRpcHMgaW4gc2NyaXB0LmpzKS4gTGl2ZXMgb3V0c2lkZVxuICogdGhlIHNjYWxlZCAucmV2ZWFsIC5zbGlkZXMgdHJhbnNmb3JtLCBzbyBzaXplcyBoZXJlIGFyZSByZWFsIHNjcmVlbiBweCwgbm90XG4gKiBzbGlkZS1zcGFjZSBweCBsaWtlIHRoZSByZXN0IG9mIHRoaXMgc3R5bGVzaGVldC5cbiAqL1xuI3Rvb2x0aXAtZmxvYXQge1xuICBkaXNwbGF5OiBub25lO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk7XG4gIG1heC13aWR0aDogNDgwcHg7XG4gIGJhY2tncm91bmQ6ICMxZTFlMWU7XG4gIGNvbG9yOiAjZDRkNGQ0O1xuICBib3JkZXI6IDFweCBzb2xpZCAjNjY2O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIHBhZGRpbmc6IDEycHggMTZweDtcbiAgZm9udC1mYW1pbHk6IFRodXlfc2VyaWY7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDEuMztcbiAgYm94LXNoYWRvdzogMCA0cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuI3Rvb2x0aXAtZmxvYXQgaW1nIHtcbiAgbWF4LXdpZHRoOiA0NDBweDtcbiAgbWF4LWhlaWdodDogMzIwcHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbn1cbiN0b29sdGlwLWZsb2F0IGlmcmFtZSB7XG4gIGJvcmRlcjogbm9uZTtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 */