<div class="exfiltrate-animated-svg-with-css">
  <div class="cpu-exfiltrator">
    <output class="cpu-phase-cycle-request0r"></output>
    <output class="svg-animation-current-state-reporter"></output>
    <div class="xfl-presentation">
      The final embeded data will be hosted on cpu-exfiltrator - and presenting
      here will allow me to show the internal states as the algorithm executes.
    </div>
  </div>
</div>
/* Markup specifically in this structure:
  <div class="exfiltrate-animated-svg-with-css">
    <div class="cpu-exfiltrator">
      <output class="cpu-phase-cycle-request0r"></output>
      <output class="svg-animation-current-state-reporter"></output>
      <div class="xfl-presentation">
        The final embeded data will be hosted on cpu-exfiltrator - and presenting
        here will allow me to show the internal states as the algorithm executes.
      </div>
    </div>
  </div>
*/

@property --xfl-cpu-phase { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl-raw-data { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl-data-type { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl-data-value { syntax: "<integer>"; initial-value: 0; inherits: true; }
@keyframes --xfl-cpu-phase { 0% { --xfl-cpu-phase: 4; } 100% { --xfl-cpu-phase: 0; } }
@keyframes --xfl-raw-data {
  0% { --xfl-raw-data: var(--xfl-max); } 100% { --xfl-raw-data: 0; }
}
@keyframes --xfl-data-type {
  0% { --xfl-data-type: 34; } 100% { --xfl-data-type: 0; }
}
@keyframes --xfl-data-value {
  0% { --xfl-data-value: var(--xfl-max); } 100% { --xfl-data-value: 0; }
}

@property --cpu-phase-next { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl-data-length { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl-checksum { syntax: "<integer>"; initial-value: 0; inherits: true; }

@property --xfl-complete { syntax: "<integer>"; initial-value: 0; inherits: true; }

/* Hosts 4 timeline values and their animations */
.exfiltrate-animated-svg-with-css {
  --xfl-max: 100000;
  --xfl-tl: --xfl-cpu-phase, --xfl-raw-data, --xfl-data-type, --xfl-data-value;
  animation:
    --xfl-cpu-phase 1ms linear,
    --xfl-raw-data 1ms linear,
    --xfl-data-type 1ms linear,
    --xfl-data-value 1ms linear;
  animation-timeline: var(--xfl-tl);
  animation-range: entry 100% exit 100%;
  timeline-scope: var(--xfl-tl);
  *, &, ::before, ::after {
    box-sizing: border-box; padding: 0px; margin: 0px;
  }
}

/* Hosts the 2 animations of the CSS CPU Hack, no timelines */
.cpu-exfiltrator {
  /* The CPU Hack's frame cycler has a 5 tick sequence now, first 4 are the same.
  // 0: ready - capture phase
  // 1: capture lock phase
  // 2: saving - hoist phase
  // 3: hoist lock phase
  // 4: CPU Frame Complete (new) helps w/sequencing stability and safe signaling.
  // In this case, 4 stays active until data-type is 0, then will become 0 again.
  // When data-type is reset, data-value is also reset.
  */
  /* CPU Hack will request capture lock phase (1) when data is ready.
  // Data ready = data-type > 0 && raw-frame-data - 35 === data-value
  */
  /* data-type values - baked into the server-side script that generates the SVG:
  // 0: local signaling in CSS here, as described above
  // 1-32: data frames. Since the SVG Animation requires 1D transmition expressed
  //   over animation time, we won't know if we're repeating values on purpose or
  //   what we're looking at in general without sentinels before each data frame.
  // 33: Data length, even if data length is 1.
  // 34: Checksum of data and length. Both PHP and CSS run the same checksum alg,
  //   if the server's checksum value matches the CSS result, we have a degree of
  //   certainty that it was successful. The SVG Animation can easily skip frames
  //   which can cause all sorts of false reads. The exfiltrator will continue to
  //   run until the checksum matches, overwritting whenever the animation loops.
  */
  
  animation: capture 1ms infinite, hoist 1ms infinite;
  animation-play-state: paused, paused;
  --cpu-next-phase: 0;
  @container style(--xfl-cpu-phase: 0) {
    animation-play-state: running, paused;
    --cpu-next-phase: 1;
  }
  @container style(--xfl-cpu-phase: 1) {
    animation-play-state: paused, paused;
    --cpu-next-phase: 2;
  }
  @container style(--xfl-cpu-phase: 2) {
    animation-play-state: paused, running;
    --cpu-next-phase: 3;
  }
  @container style(--xfl-cpu-phase: 3) {
    animation-play-state: paused, paused;
    --cpu-next-phase: 4;
  }
  @container style(--xfl-cpu-phase: 4) {
    animation-play-state: paused, paused;
    --cpu-next-phase: calc(
      min(1, var(--xfl-data-type)) * 4
    );
  }

  --xfl\\1: calc(
    var(--xfl\\1-hoist, 0) + 1
  );
}

/* Sources the timeline controlling the CPU Hack's 5 tick sequence / CPU frame */
.cpu-phase-cycle-request0r {
}

/* Sources 3 timelines to read & report the Animated SVG's current indicated data
// WARN: There is 1 frame between raw & type, and 1 SVG step between type & value
// raw-frame-data: the data reported by reading the SVG Animation's current frame
// data-type: Indicates what the next SVG Animation step's data represents & will
//   hold on to it THROUGH the next step - keeping in in scope for the data-value
// data-value: 0 if typing step, else the 16 bit data value indicated by raw - 35
*/
.svg-animation-current-state-reporter { display: none; }
/* the container style condition is "if not complete" */
@container style(--xfl-complete: 0) {
  .svg-animation-current-state-reporter {
    /* The CPU Hack's cycler phase also indicates the timing of what to do here. */
    /* Phase 0 indicates we are to move forward with reading SVG Animation data. */
    /* Phase 4 signals resetting data type and value to 0, which causes phase 0. */
    /* WARN: SVG may skip steps rendering, so rewrite & checksum helps accuracy. */
    display: block;
    
    /* --xfl-raw-data, --xfl-data-type, --xfl-data-value */
    &::before {
      content: /*url('http://css-api.propjockey.io/api.svg.php?');*/
    }
    &::after {
      content: "";
      /* there's 4 stages here
      // 1) cpu tells us to reset to 0s
      // 2) cpu is in phase 0 (capture running) and stays until these stages finish
      //   a. if svg animation frame (based on raw) is type, set type else use prev
      //   3. if svg animation frame (based on raw) is data, set data else use prev
      // 4) CPU is executing, our job is to hold prev values and ignore the SVG ani
      */
    }
  }
}

@property --xfl\\1 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\2 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\3 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\4 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\5 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\6 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\7 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\8 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\9 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\10 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\11 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\12 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\13 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\14 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\15 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\16 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\17 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\18 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\19 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\20 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\21 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\22 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\23 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\24 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\25 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\26 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\27 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\28 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\29 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\30 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\31 { syntax: "<integer>"; initial-value: 0; inherits: true; }
@property --xfl\\32 { syntax: "<integer>"; initial-value: 0; inherits: true; }

@keyframes capture {
  0%, 100% {
    --xfl-data-length-captured: var(--xfl-data-length);
    --xfl-checksum-captured: var(--xfl-checksum);
    --xfl\\1-captured: var(--xfl\\1);
    --xfl\\2-captured: var(--xfl\\2);
    --xfl\\3-captured: var(--xfl\\3);
    --xfl\\4-captured: var(--xfl\\4);
    --xfl\\5-captured: var(--xfl\\5);
    --xfl\\6-captured: var(--xfl\\6);
    --xfl\\7-captured: var(--xfl\\7);
    --xfl\\8-captured: var(--xfl\\8);
    --xfl\\9-captured: var(--xfl\\9);
    --xfl\\10-captured: var(--xfl\\10);
    --xfl\\11-captured: var(--xfl\\11);
    --xfl\\12-captured: var(--xfl\\12);
    --xfl\\13-captured: var(--xfl\\13);
    --xfl\\14-captured: var(--xfl\\14);
    --xfl\\15-captured: var(--xfl\\15);
    --xfl\\16-captured: var(--xfl\\16);
    --xfl\\17-captured: var(--xfl\\17);
    --xfl\\18-captured: var(--xfl\\18);
    --xfl\\19-captured: var(--xfl\\19);
    --xfl\\20-captured: var(--xfl\\20);
    --xfl\\21-captured: var(--xfl\\21);
    --xfl\\22-captured: var(--xfl\\22);
    --xfl\\23-captured: var(--xfl\\23);
    --xfl\\24-captured: var(--xfl\\24);
    --xfl\\25-captured: var(--xfl\\25);
    --xfl\\26-captured: var(--xfl\\26);
    --xfl\\27-captured: var(--xfl\\27);
    --xfl\\28-captured: var(--xfl\\28);
    --xfl\\29-captured: var(--xfl\\29);
    --xfl\\30-captured: var(--xfl\\30);
    --xfl\\31-captured: var(--xfl\\31);
    --xfl\\32-captured: var(--xfl\\32);
  }
}
@keyframes hoist {
  0%, 100% {
    --xfl-data-length-hoist: var(--xfl-data-length-captured, 0);
    --xfl-checksum-hoist: var(--xfl-checksum-captured, 0);
    --xfl\\1-hoist: var(--xfl\\1-captured, 0);
    --xfl\\2-hoist: var(--xfl\\2-captured, 0);
    --xfl\\3-hoist: var(--xfl\\3-captured, 0);
    --xfl\\4-hoist: var(--xfl\\4-captured, 0);
    --xfl\\5-hoist: var(--xfl\\5-captured, 0);
    --xfl\\6-hoist: var(--xfl\\6-captured, 0);
    --xfl\\7-hoist: var(--xfl\\7-captured, 0);
    --xfl\\8-hoist: var(--xfl\\8-captured, 0);
    --xfl\\9-hoist: var(--xfl\\9-captured, 0);
    --xfl\\10-hoist: var(--xfl\\10-captured, 0);
    --xfl\\11-hoist: var(--xfl\\11-captured, 0);
    --xfl\\12-hoist: var(--xfl\\12-captured, 0);
    --xfl\\13-hoist: var(--xfl\\13-captured, 0);
    --xfl\\14-hoist: var(--xfl\\14-captured, 0);
    --xfl\\15-hoist: var(--xfl\\15-captured, 0);
    --xfl\\16-hoist: var(--xfl\\16-captured, 0);
    --xfl\\17-hoist: var(--xfl\\17-captured, 0);
    --xfl\\18-hoist: var(--xfl\\18-captured, 0);
    --xfl\\19-hoist: var(--xfl\\19-captured, 0);
    --xfl\\20-hoist: var(--xfl\\20-captured, 0);
    --xfl\\21-hoist: var(--xfl\\21-captured, 0);
    --xfl\\22-hoist: var(--xfl\\22-captured, 0);
    --xfl\\23-hoist: var(--xfl\\23-captured, 0);
    --xfl\\24-hoist: var(--xfl\\24-captured, 0);
    --xfl\\25-hoist: var(--xfl\\25-captured, 0);
    --xfl\\26-hoist: var(--xfl\\26-captured, 0);
    --xfl\\27-hoist: var(--xfl\\27-captured, 0);
    --xfl\\28-hoist: var(--xfl\\28-captured, 0);
    --xfl\\29-hoist: var(--xfl\\29-captured, 0);
    --xfl\\30-hoist: var(--xfl\\30-captured, 0);
    --xfl\\31-hoist: var(--xfl\\31-captured, 0);
    --xfl\\32-hoist: var(--xfl\\32-captured, 0);
  }
}

.xfl-presentation {
  /* The final embeded data will be hosted on cpu-exfiltrator - and presenting
  // here will allow me to show the internal states as the algorithm executes.
  */
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.