Kit Ravel : démonstrations en ligne#

Pour une utilisation avec simulateur (plus d’explications ici) :

  • Simulation Wokwi ;
  • .

Bouton Run pour (re)lancer l’application. Le code source est modifiable.

Headless (sans interface graphique)#

RAZ#

Remise à zéro du kit

import ucuq ucuq.ravel.raz()

Buzzer#

Beep#

import ucuq FREQ = 440 buzzer = ucuq.ravel.buzzer buzzer.on(FREQ) ucuq.sleep(1) buzzer.off()

Gammes#

import ucuq FREQ_LOW = 220 FREQ_HIGH = 880 DELAY_TIME = .1 NUM_STEPS = 24 buzzer = ucuq.ravel.buzzer coeff = (FREQ_HIGH/FREQ_LOW)**(1/NUM_STEPS) for i in range(NUM_STEPS): buzzer.on(int(FREQ_LOW * coeff ** i)) ucuq.sleep(DELAY_TIME) for i in range(NUM_STEPS + 1): buzzer.on(int(FREQ_HIGH / coeff ** i)) ucuq.sleep(DELAY_TIME) buzzer.off()

Anneau RGB#

Uni#

import ucuq R = 10 G = 8 B = 1 ring = ucuq.ravel.ring ring.fill((R, G, B)).write()

Rainbow#

import ucuq, random MIN = 1 MAX = 5 ring = ucuq.ravel.ring for _ in range(15): for led in range(8): ring.setValue(led, tuple((lambda: random.randint(MIN, MAX))() for _ in range(3))).write() ucuq.sleep(.03) ucuq.sleep(2) ring.fill((0, 0, 0)).write()

Panneau LCD (panel)#

Simple affichage#

NAME = """ """.strip().rjust(16) import ucuq panel = ucuq.ravel.panel panel.putString("Salutations".ljust(16) + NAME).backlightOn()

Vagues#

import ucuq DELAY = 0.07 COUNT = 2 panel = ucuq.ravel.panel panel.uploadUpwardGaugeChars().backlightOn() gauges = () def mirror(str): return str[:8] + tuple(str[i] for i in range(7, -1, -1,)) def morph(a, b): steps = max(abs(x - y) for x, y in zip(a, b)) for s in range(1, steps): ucuq.sleep(DELAY) panel.putUpwardGauges(0, [int(ai + s / (steps - 1) * (bi - ai)) for ai, bi in zip(a, b)]) for j in range(0, 32 * COUNT): gauges = ((abs((j + 16) % 32 - 16),) + gauges)[:16] ucuq.sleep(DELAY) panel.putUpwardGauges(0, gauges) morph(gauges, mirror(gauges)) for j in range(0, 32 * COUNT): gauges = ((abs((j + 16) % 32 - 16),) + gauges)[:16] ucuq.sleep(DELAY) panel.putUpwardGauges(0, mirror(gauges)) morph(mirror(gauges), (0,) * 16) ucuq.sleep(DELAY) panel.backlightOff()

Écran OLED (screen)#

Texte#

import ucuq, datetime screen = ucuq.ravel.screen screen.text("Nous sommes le".center(16), 0, 20).text(f"{datetime.datetime.now().strftime("%d/%m/%Y %H:%M").center(16)}", 0, 40).show()

Dessin#

import ucuq screen = ucuq.ravel.screen screen.draw("03c00c30181820044c32524a80018001824181814812442223c410080c3003c0", 16, mul=4, ox=32).show()

Animation#

NOTA : le lancement de l’animation peut prendre quelques secondes…

import base64 import zlib import ucuq screen = ucuq.ravel.screen ANIMATION = ( "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", ) for _ in range(10): for picture in ANIMATION: screen.draw(zlib.decompress(base64.b64decode(picture)).decode(), 128).show() screen.fill(0).show()

Servomoteur#

import ucuq upper = ucuq.ravel.upper upper.set(ucuq.ravel.SERVO_MAX // 2) ucuq.sleep(0.5) upper.park()

Avec interface graphique#

Boilerplate (exemple de base)#

Une application minimaliste pour allumer/éteindre l’afficheur 7 segments (simulation) ou la DEL embarquée (kit physique).

import ucuq, atlastk led = ucuq.GPIO(8) async def atk(dom): await dom.inner("", BODY) led.high() async def atkSwitch(dom, id): if await dom.getValue(id) == "true": led.low() else: led.high() BODY = """ <fieldset> <label> <span>On/off: </span> <input type="checkbox" xdh:onevent="Switch"> </label> </fieldset> """ atlastk.launch(globals=globals())

Figures de Chernoff#

Application affichant des figures de Chernoff.

import atlastk, math, ucuq panel = ucuq.ravel.panel screen = ucuq.ravel.screen class ChernoffFace: def __init__(self, fb, width, height, cx, cy): self.fb = fb self.width = width self.height = height self.cx = cx self.cy = cy self.face_color = 1 # 18 paramètres du visage de Chernoff self.face_width = 1.0 # 1. Largeur du visage (ratio) self.face_height = 1.0 # 2. Hauteur du visage (ratio) self.face_shape = 1.0 # 3. Forme du visage (-1 à 1, rond vs ovale) self.eye_size = 0.5 # 4. Taille des yeux (0 à 1) self.eye_spacing = 0.5 # 5. Écartement des yeux (0 à 1) self.eye_height = 0.0 # 6. Position verticale des yeux (-1 à 1) self.eye_eccentricity = 0.5 # 7. Excentricité des yeux (0=rond, 1=ovale) self.eye_angle = 0.0 # 8. Inclinaison des yeux (-45 à 45 degrés) self.pupil_size = 0.5 # 9. Taille des pupilles (0 à 1) self.pupil_position = 0.0 # 10. Position horizontale pupilles (-1 à 1) self.eyebrow_length = 0.5 # 11. Longueur des sourcils (0 à 1) self.eyebrow_angle = 0.0 # 12. Inclinaison sourcils (-45 à 45 degrés) self.eyebrow_height = 0.2 # 13. Position verticale sourcils (0 à 1) self.nose_length = 0.5 # 14. Longueur du nez (0 à 1) self.nose_width = 0.5 # 15. Largeur du nez (0 à 1) self.mouth_width = 0.5 # 16. Largeur de la bouche (0 à 1) self.mouth_height = 0.0 # 17. Position verticale bouche (-1 à 1) self.mouth_curve = 0.0 # 18. Courbure de la bouche (-1=triste, 1=souriant) # --- Méthodes de configuration individuelles --- def set_face_dimensions(self, width_ratio, height_ratio, shape): self.face_width = max(0.5, min(1.5, width_ratio)) self.face_height = max(0.5, min(1.5, height_ratio)) self.face_shape = max(-1, min(1, shape)) def set_eyes(self, size, spacing, height, eccentricity, angle): self.eye_size = max(0, min(1, size)) self.eye_spacing = max(0, min(1, spacing)) self.eye_height = max(-1, min(1, height)) self.eye_eccentricity = max(0, min(1, eccentricity)) self.eye_angle = max(-45, min(45, angle)) def set_pupils(self, size, position): self.pupil_size = max(0, min(1, size)) self.pupil_position = max(-1, min(1, position)) def set_eyebrows(self, length, angle, height): self.eyebrow_length = max(0, min(1, length)) self.eyebrow_angle = max(-45, min(45, angle)) self.eyebrow_height = max(0, min(1, height)) def set_nose(self, length, width): self.nose_length = max(0, min(1, length)) self.nose_width = max(0, min(1, width)) def set_mouth(self, width, height, curve): self.mouth_width = max(0, min(1, width)) self.mouth_height = max(-1, min(1, height)) self.mouth_curve = max(-1, min(1, curve)) def set_from_dict(self, params): """Configure tous les paramètres depuis un dictionnaire""" for key, value in params.items(): if hasattr(self, key): setattr(self, key, value) # --- Méthode de dessin --- def draw(self): self._draw_face_outline() self._draw_eyebrows() self._draw_eyes() self._draw_pupils() self._draw_nose() self._draw_mouth() # --- Détails du dessin --- def _draw_face_outline(self): rx = int(self.width * self.face_width / 2) ry = int(self.height * self.face_height / 2) # Ajustement de forme (ellipse vs cercle) if self.face_shape > 0: ry = int(ry * (1 + self.face_shape * 0.3)) else: rx = int(rx * (1 - self.face_shape * 0.3)) self.fb.ellipse(self.cx, self.cy, rx, ry, self.face_color) def _draw_eyes(self): spacing = int(self.width * 0.3 * self.eye_spacing) y_offset = int(self.height * 0.15 * self.eye_height) eye_y = self.cy - self.height // 6 + y_offset rx = int(self.width * 0.08 * self.eye_size) ry = int(rx * (1 - self.eye_eccentricity * 0.5)) angle = math.radians(self.eye_angle) for side in (-1, 1): ex = self.cx + side * spacing self._ellipse_rotated(ex, eye_y, rx, ry, angle, self.face_color) def _draw_pupils(self): if self.pupil_size == 0: return spacing = int(self.width * 0.3 * self.eye_spacing) y_offset = int(self.height * 0.15 * self.eye_height) eye_y = self.cy - self.height // 6 + y_offset pupil_r = int(self.width * 0.03 * self.pupil_size) pupil_x_offset = int(self.width * 0.02 * self.pupil_position) for side in (-1, 1): px = self.cx + side * spacing + pupil_x_offset self._fill_circle(px, eye_y, pupil_r, self.face_color) def _draw_eyebrows(self): if self.eyebrow_length == 0: return spacing = int(self.width * 0.3 * self.eye_spacing) y_offset = int(self.height * 0.15 * self.eye_height) base_y = self.cy - self.height // 6 + y_offset brow_y = base_y - int(self.height * 0.1 * self.eyebrow_height) - 5 length = int(self.width * 0.1 * self.eyebrow_length) angle = math.radians(self.eyebrow_angle) for side in (-1, 1): bx = self.cx + side * spacing dx = int(length * math.cos(angle)) * side dy = int(length * math.sin(angle)) * side self.fb.line(bx - dx, brow_y - dy, bx + dx, brow_y + dy, self.face_color) def _draw_nose(self): if self.nose_length == 0: return nx = self.cx nose_h = int(self.height * 0.15 * self.nose_length) nose_w = int(self.width * 0.08 * self.nose_width) ny_top = self.cy - nose_h // 2 ny_bottom = self.cy + nose_h // 2 half_w = nose_w // 2 x1, y1 = nx - half_w, ny_bottom x2, y2 = nx + half_w, ny_bottom x3, y3 = nx, ny_top self.fb.line(x1, y1, x2, y2, self.face_color) self.fb.line(x2, y2, x3, y3, self.face_color) self.fb.line(x3, y3, x1, y1, self.face_color) def _draw_mouth(self): mw = int(self.width * 0.4 * self.mouth_width) if mw < 2: return y_offset = int(self.height * 0.15 * self.mouth_height) y_base = self.cy + self.height // 4 + y_offset curve_amp = int(self.height * 0.1 * self.mouth_curve) x1 = self.cx - mw // 2 steps = mw lastx, lasty = x1, y_base for i in range(1, steps + 1): x = x1 + i t = math.pi * i / steps y = y_base - int(curve_amp * math.sin(t)) self.fb.line(lastx, lasty, x, y, self.face_color) lastx, lasty = x, y # --- Utilitaires de dessin --- def _ellipse_rotated(self, x0, y0, rx, ry, angle, color): steps = 20 for i in range(steps): theta1 = 2 * math.pi * i / steps theta2 = 2 * math.pi * (i + 1) / steps x1 = rx * math.cos(theta1) y1 = ry * math.sin(theta1) x2 = rx * math.cos(theta2) y2 = ry * math.sin(theta2) px1 = x0 + x1 * math.cos(angle) - y1 * math.sin(angle) py1 = y0 + x1 * math.sin(angle) + y1 * math.cos(angle) px2 = x0 + x2 * math.cos(angle) - y2 * math.sin(angle) py2 = y0 + x2 * math.sin(angle) + y2 * math.cos(angle) self.fb.line(int(px1), int(py1), int(px2), int(py2), color) def _fill_circle(self, x, y, r, color): for dy in range(-r, r + 1): dx = int(math.sqrt(r * r - dy * dy)) self.fb.hLine(x - dx, y + dy, 2 * dx + 1, color) chernoff = ChernoffFace(screen, 60, 60, 64, 32) async def atk(dom): await dom.inner("", BODY) chernoff.draw() screen.show() async def atkSet(dom, id): value = await dom.getValue(id) panel.clear().moveTo(0,0).putString(f"{id}:").moveTo(0,1).putString(f"{value}").backlightOn() exec(f"chernoff.{id} = {float(value)}") screen.fill(0) chernoff.draw() screen.show() BODY = """ <fieldset style="display: flex;"> <legend>Chernoff's faces (AI-generated)</legend> <span> <fieldset style="display:flex; flex-direction: column"> <legend>Eyes</legend> <input type="range" id="eye_size" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="eye_spacing" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="eye_height" min="-1" max="1" step="0.01" value="0" xdh:onevent="Set"> <input type="range" id="eye_eccentricity" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="eye_angle" min="-45" max="45" step="1" value="0" xdh:onevent="Set"> </fieldset> <fieldset style="display:flex; flex-direction: column"> <legend>Pupil</legend> <input type="range" id="pupil_size" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="pupil_position" min="-1" max="1" step="0.01" value="0" xdh:onevent="Set"> </fieldset> <fieldset style="display:flex; flex-direction: column"> <legend>Nose</legend> <input type="range" id="nose_length" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="nose_width" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> </fieldset> </span> <span> <fieldset style="display:flex; flex-direction: column"> <legend>Face</legend> <input type="range" id="face_width" min="0" max="1" step="0.01" value="1" xdh:onevent="Set"> <input type="range" id="face_height" min="0" max="1" step="0.01" value="1" xdh:onevent="Set"> <input type="range" id="face_shape" min="-1" max="1" step="0.01" value="1" xdh:onevent="Set"> </fieldset> <fieldset style="display:flex; flex-direction: column"> <legend>Eyebrow</legend> <input type="range" id="eyebrow_length" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="eyebrow_angle" min="-15" max="45" step="1" value="0" xdh:onevent="Set"> <input type="range" id="eyebrow_height" min="0" max="1" step="0.01" value="0.2" xdh:onevent="Set"> </fieldset> <fieldset style="display:flex; flex-direction: column"> <legend>Mouth</legend> <input type="range" id="mouth_width" min="0" max="1" step="0.01" value="0.5" xdh:onevent="Set"> <input type="range" id="mouth_height" min="-1" max="1" step="0.01" value="0" xdh:onevent="Set"> <input type="range" id="mouth_curve" min="-1" max="1" step="0.01" value="0" xdh:onevent="Set"> </fieldset> </span> </fieldset>""" atlastk.launch(globals=globals())

Simon’s game#

Un jeu inspiré de Simon.

import atlastk, ucuq, json, math, random seq = "" userSeq = "" panel = ucuq.ravel.panel ring = ucuq.ravel.ring buzzer = ucuq.ravel.buzzer screen = ucuq.ravel.screen panel.backlightOn() trueBuzzer = buzzer ringCount = 8 ringOffset = 2 ringLimiter = 31 def buzzerBeep_(note, delay=0.29, sleep=0.01): buzzer.play(57 + note) ucuq.sleep(delay) buzzer.off() if sleep: ucuq.sleep(sleep) def ringFlash_(button): ring.fill([0, 0, 0]) if button in BUTTONS: for i in range(ringCount // 4): ring.setValue( ( list(BUTTONS.keys()).index(button) * ringCount // 4 + i + ringOffset ) % ringCount, [ringLimiter * item // 255 for item in BUTTONS[button][0]], ) ring.write() def screenDigit_(n, offset): screen.draw(DIGITS[n], 8, offset, mul=8) def playJingle_(jingle): prevButton = "" prevPrevButton = "" for n in jingle: while True: button = random.choice(list(BUTTONS.keys())) if (button != prevButton) and (button != prevPrevButton): break prevPrevButton = prevButton ringFlash_(prevButton := button) buzzerBeep_(n, 0.15, 0) ringFlash_("") def screenNumber(n): try: screenDigit_(n // 10, 12) screenDigit_(n % 10, 76) except: screen.fill(0) screen.show() def panelClear(): panel.clear() def panelDisplay(line, text): panel.moveTo(0, line).putString(text.ljust(16)) def panelBacklightOn(): panel.backlightOn() def panelBacklightOff(): panel.backlightOff() def panelDisplaySequence(seq, l10n): panelClear() panelDisplay(0, "".join(l10n(12)["RGBY".index(char)] for char in seq)) panelBacklightOn() def begin(l10n): panelClear() panelDisplay(0, l10n(10).format(**l10n(new=8)).center(16)) panelDisplay(1, l10n(11).center(16)) screenNumber(None) commit() return not isinstance(buzzer, ucuq.Nothing) def new(seq, l10n): screenNumber(None) panelClear() panelDisplay(0, l10n(3)) panelDisplay(1, l10n(4)) screenNumber(0) ucuq.sleep(0.75) play(seq) commit() def restartHW(seq, l10n): screenNumber(None) panelClear() panelDisplay(0, l10n(1)) panelDisplay(1, l10n(2)) panelBacklightOn() playJingle_(LAUNCH_JINGLE) ucuq.sleep(0.5) new(seq, l10n) def success(l10n): panelDisplay(0, l10n(5)) screenNumber(None) screen.draw(HAPPY_MOTIF, 16, mul=4, ox=32).show() playJingle_(SUCCESS_JINGLE) ucuq.sleep(0.5) panelClear() commit() def failure(l10n): panelDisplay(0, l10n(6).format(**l10n(new=8))) panelDisplay(1, l10n(7)) screenNumber(len(seq)) buzzer.on(30) screenNumber(None) screen.fill(0).draw(SAD_MOTIF, 16, mul=4, ox=32).show() ucuq.sleep(1) buzzer.off() commit() def buzzerSwitch(status): global buzzer if status: buzzer = trueBuzzer else: buzzer = ucuq.Nothing() def displayButton(button): ringFlash_(button) buzzer.play(57 + BUTTONS[button][2]) ucuq.sleep(0.29) buzzer.off() ring.fill([0, 0, 0]).write() ucuq.sleep(0.01) def play(sequence): seq = "" for s in sequence: screenNumber(len(seq) + 1) displayButton(s) seq += s if len(seq) % 5: commit() def commit(): ucuq.commit() def getValuesOfVarsBeginningWith(prefix): return [value for var, value in globals().items() if var.startswith(prefix)] def remove(source, items): return [item for item in source if item not in items] BUTTONS = { "R": [[255, 0, 0], 5, 9], "B": [[0, 0, 255], 7, 12], "Y": [[255, 255, 0], 1, 17], "G": [[0, 255, 0], 3, 5], } LAUNCH_JINGLE = [3, 10, 0, 8, 7, 5, 3, 7, 10, 8, 5, 3] SUCCESS_JINGLE = [7, 10, 19, 15, 17, 22] async def restartAwait(dom): global seq seq = random.choice("RGBY") restartHW(seq, lambda m: dom.getL10n(m)) await dom.setValue("Length", str(len(seq))) async def atk(dom): global seq, userSeq body = BODY.format(**dom.getL10n(new=8, repeat=9)) ucuq.setCommitBehavior(ucuq.CB_MANUAL) await dom.inner("", body) seq = "" userSeq = "" if begin(lambda *args, **kwargs: dom.getL10n(*args, **kwargs)): await dom.setAttribute("Buzzer", "checked", "") async def atkRepeat(): play(seq) commit() async def atkNew(dom): await restartAwait(dom) async def atkClick(dom, id): global seq, userSeq if not seq: return userSeq += id panelDisplaySequence(userSeq, lambda m: dom.getL10n(m)) screenNumber(len(seq) - len(userSeq)) displayButton(id) if seq.startswith(userSeq): if len(userSeq) >= len(seq): success(lambda m: dom.getL10n(m)) userSeq = "" seq += random.choice("RGBY") new(seq, lambda m: dom.getL10n(m)) ucuq.sleep(1.5) await dom.setValue("Length", str(len(seq))) else: panelBacklightOff() else: failure(lambda *args, **kwargs: dom.getL10n(*args, **kwargs)) userSeq = "" seq = "" commit() async def atkSwitchSound(dom, id): buzzerSwitch(await dom.getValue(id) == "true") ATK_HEAD = """ <style> #outer-circle { background: #385a94; border-radius: 50%; height: 360px; width: 360px; position: relative; border-style: solid; border-width: 5px; margin: auto; box-shadow: 8px 8px 15px 5px #888888; } #G { position: absolute; height: 180px; width: 180px; border-radius: 180px 0 0 0; -moz-border-radius: 180px 0 0 0; -webkit-border-radius: 180px 0 0 0; background: darkgreen; top: 50%; left: 50%; margin: -180px 0px 0px -180px; border-style: solid; border-width: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } #R { position: absolute; height: 180px; width: 180px; border-radius: 0 180px 0 0; -moz-border-radius: 0 180px 0 0; -webkit-border-radius: 0 180px 0 0; background: darkred; top: 50%; left: 50%; margin: -180px 0px 0px 0px; border-style: solid; border-width: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } #Y { position: absolute; height: 180px; width: 180px; border-radius: 0 0 0 180px; -moz-border-radius: 0 0 0 180px; -webkit-border-radius: 0 0 0 180px; background: goldenrod; top: 50%; left: 50%; margin: 0px -180px 0px -180px; border-style: solid; border-width: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } #B { position: absolute; height: 180px; width: 180px; border-radius: 0 0 180px 0; -moz-border-radius: 0 0 180px 0; -webkit-border-radius: 0 0 180px 0; background: darkblue; top: 50%; left: 50%; margin: 0px 0px -180px 0px; border-style: solid; border-width: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } #inner-circle { position: absolute; background: grey; border-radius: 50%; height: 180px; width: 180px; border-style: solid; border-width: 10px; top: 50%; left: 50%; margin: -90px 0px 0px -90px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } button { font-size: x-large; margin-top: 5px; } </style> """ BODY = """ <fieldset> <legend xdh:onevent="dblclick|UCUqXDevice">Simon's game</legend> <input id="Color" type="hidden"> <div id="outer-circle"> <div id="G" xdh:onevent="Click"></div> <div id="R" xdh:onevent="Click"></div> <div id="Y" xdh:onevent="Click"></div> <div id="B" xdh:onevent="Click"></div> <div id="inner-circle" style="display: flex;justify-content: center;align-items: center; flex-direction: column;"> <label style="display: flex; background-color: white; margin-top: 1px;"> <span style="font-size: large;">🎵:</span> <input id="Buzzer" type="checkbox" xdh:onevent="SwitchSound"> </label> <div> <button xdh:onevent="New">{new}</button> </div> <div> <button xdh:onevent="Repeat">{repeat}</button> </div> <output id="Length" style="background-color: white; display: inline-grid; width: 2rem; margin-top:5px; justify-content: center;">  </output> </div> </div> </fieldset> """ ATK_L10N = ( ( "en", "fr", "de" ), ( "Watch, Remember,", "Observer, memo-", "Achten, merken," ), ( "Repeat!", "riser, repeter !", "wiederholen! " ), ( "Reproduce the", "Reproduire la", "Sequenz" ), ( "sequence...", "sequence...", "wiederholen..." ), ( "Well done!", "Bravo!", "Gut gemacht!" ), ( "Game over! '{new}'", "Perdu! '{new}'", "Verloren! '{new}'" ), ( "to play again!", "pour rejouer!", "zum Neustart!" ), ( "New", "Nouveau", "Neu" ), ( "Repeat", "Répéter", "Wiederhol." ), ( "Click '{new}' to", "'{new}' pour", "'{new}' anklicken", ), ( "begin the game!", "commencer !", "um zu beginnen!" ), ( "RGBY", "RVBJ", "RGBY", ), ) DIGITS = ( "708898A8C88870", "20602020202070", "708808304080f8", "f8081030088870", "10305090f81010", "f880f008088870", "708880f0888870", "f8081020404040", "70888870888870", "70888878088870", ) HAPPY_MOTIF = "03c00c30181820044c32524a80018001824181814812442223c410080c3003c0" SAD_MOTIF = "03c00c30181820044c3280018001824181814002400227e410080c3003c0" atlastk.launch(globals=globals())

Pierre-feuille-ciseaux#

import atlastk, ucuq, random, math panel = ucuq.ravel.panel ring = ucuq.ravel.ring buzzer = ucuq.ravel.buzzer screen = ucuq.ravel.screen RING_MAX_ = 10 COLOR_1_ = (0, RING_MAX_, 0) COLOR_2_ = (0, 0, RING_MAX_) COLOR_TIE_ = (RING_MAX_, RING_MAX_, 0) ROCK_ = 0 PAPER_ = 1 SCISSORS_ = 2 NOTHING_ = 3 noMaster_ = True ledsStatus_ = ucuq.Multi() ledsPlayer1_ = ucuq.Multi() ledsPlayer2_ = ucuq.Multi() ledsTie_ = ucuq.Multi() class LED_: def __init__(self, position): self.position_ = position def setValue(self, col): ring.setValue(self.position_ + 2, col) def groupLeds_(leds, positions): for position in positions: leds.add(LED_(position)) def setAllLedGroups_(): groupLeds_(ledsStatus_, (0, 7)) groupLeds_(ledsPlayer1_, (4, 5)) groupLeds_(ledsTie_, (3, 4)) groupLeds_(ledsPlayer2_, (2, 3)) def play_(song): ucuq.sleepStart() ucuq.playVoices((song,), 120, lambda freq: ( buzzer.off(), buzzer.on(freq) if freq != 0 else None ) if freq != -1 else None, lambda tracking: ( ucuq.sleepWait(tracking.duration), ucuq.sleepStart() ) ) def panelScoreAndWinner_(score1, score2, winner, L10n): score = score1 if winner == 1 else score2 scoreString = str(score - 1).center(8) + str(score).center(8) line2 = " " * 16 + (L10n(6) if winner == 0 else L10n(5).format(winner)).center(16) for i in range(17): if winner != 0: panel.moveTo(0 if winner == 1 else 8, 0).putString(scoreString[i // 2: i // 2 + 8]) panel.moveTo(0, 1).putString(line2[i : i + 16]) # ucuq.sleep(0.00001 * (2 if winner else 1) ) def newGame_(dom): global player1_, score1_, score2_ player1_ = None score1_, score2_ = 0, 0 ring.fill((0, 0, 0)) ledsStatus_.setValue(COLOR_TIE_) ring.write() play_(INTRO_SONG_) panel.moveTo(0,0)\ .putString("0".center(8) * 2)\ .moveTo(0,1)\ .putString(dom.getL10n(4).center(16))\ .backlightOn() async def atkbDisplay(dom, extra): def getClass(winner, player): if winner == 3: return "tie" elif winner == player: return "winner" else: return "pending" winner = int(extra[:1]) if not str(id(dom)) == extra[3:] or winner != 0: await dom.removeClasses({"Player1": ALL_CLASSES_, "Player2": ALL_CLASSES_}) await dom.addClasses( { "Player1": [CLASSES_[int(extra[1])], getClass(winner, 1)], "Player2": [CLASSES_[int(extra[2])], getClass(winner, 2)], } ) await dom.setValues( { "Status": dom.getL10n(1).format(1 if player1_ is None else 2), "Score1": score1_, "Score2": score2_, } ) async def atk(dom): global noMaster_ if noMaster_: noMaster_ = False dom.isMaster = True newGame_(dom) await dom.inner("", BODY_) await atkbDisplay(dom, f"0{NOTHING_}{NOTHING_}{id(dom)}") await dom.setValues({"Title": dom.getL10n(2), "New": dom.getL10n(3), "Score": dom.getL10n(7)}) async def atkNew(dom): newGame_(dom) atlastk.broadcastAction(atkbDisplay, f"0{NOTHING_}{NOTHING_}dummyObjectId") async def handleMove_(dom, move): global player1_, score1_, score2_ ring.fill((0, 0, 0)) toAll = f"0{NOTHING_}{NOTHING_}{id(dom)}" if player1_ is None: player1_ = move screen.fill(0).draw(SCREEN_PICTURES_[3], 128).show() panel.moveTo(0,1).putString(dom.getL10n(1).format(2).replace("…", "...").center(16)) song = MOVE_SONG_ await dom.removeClasses({"Player1": ALL_CLASSES_, "Player2": ALL_CLASSES_}) await dom.addClasses( { "Player1": [CLASSES_[move], "pending"], "Player2": [CLASSES_[NOTHING_], "pending"], } ) else: toAll = f"{player1_}{move}{id(dom)}" match (winner := WINNER_[(player1_, move)]): case 0: ledsTie_.setValue(COLOR_TIE_) song = TIE_SONG_ toAll = "3" + toAll case 1: score1_ += 1 ledsPlayer1_.setValue(COLOR_1_) song = SONG_1_ toAll = "1" + toAll case 2: score2_ += 1 ledsPlayer2_.setValue(COLOR_2_) song = SONG_2_ toAll = "2" + toAll screen.draw(FLIPPED_SCREEN_PICTURES_[player1_], 64).draw( SCREEN_PICTURES_[move], 64, ox=64 ) if winner != 0: screen.rect(0 if winner == 1 else 64, 0, 64, 64, 1) screen.show() player1_ = None if score1_ < score2_: ledsStatus_.setValue(COLOR_2_) elif score1_ == score2_: ledsStatus_.setValue(COLOR_TIE_) else: ledsStatus_.setValue(COLOR_1_) ring.write() atlastk.broadcastAction(atkbDisplay, toAll) play_(song) if player1_ is None: panelScoreAndWinner_( score1_, score2_, winner, lambda i : dom.getL10n(i) ) async def atkClick(dom, id): await handleMove_(dom, int(id)) async def atkAIMove(dom): await handleMove_(dom, random.randrange(3)) def flip_(hexString: str, width: int) -> str: bits = "".join(f"{int(c, 16):04b}" for c in hexString) flippedBitsLines = [] for y in range(len(bits) // width): line = bits[y * width : (y + 1) * width] flippedLines = line[::-1] flippedBitsLines.append(flippedLines) flippedBits = "".join(flippedBitsLines) result = "" for i in range(len(flippedBits) // 4): nibble = flippedBits[4 * i : 4 * (i + 1)] result += f"{int(nibble, 2):x}" return result ATK_L10N = ( ("en", "fr", "de"), ("To player {}…", "Au joueur {}…", "An Spieler {} …"), ("Rock paper scissors", "Pierre-feuille-ciseaux", "Schere, Stein, Papier"), ("New game", "Nouvelle partie", "Neues Spiel"), ("Let's play!", "C'est parti!", "Los geht's!"), ("Player {} wins!", "Joueur {} gagne !", "Spieler {} siegt!"), ("It's a tie!", "Match nul !", "Unentschieden!"), ("Score", "Score", "Stand") ) WINNER_ = { (ROCK_, ROCK_): 0, (ROCK_, PAPER_): 2, (ROCK_, SCISSORS_): 1, (PAPER_, ROCK_): 1, (PAPER_, PAPER_): 0, (PAPER_, SCISSORS_): 2, (SCISSORS_, ROCK_): 2, (SCISSORS_, PAPER_): 1, (SCISSORS_, SCISSORS_): 0, } INTRO_SONG_ = "C42 C52 B42 D42 E42 A42 G42" TIE_SONG_ = "C24" SONG_1_ = "C42 E42 G42" SONG_2_ = "C42 G42 E42" MOVE_SONG_ = "G41" SCREEN_PICTURES_ = ( """000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e000000000000003f000000000000007f80000000000000ffc0000000000000ffe00000000000007f000000000000007e00000000000000787000000000007e31fe0000000000ff03ff8000000000ff87ffe000000000ff1ffff000000000fc3ffff800000000f8fffffc0000000071fffffe0000000003fe7fff0000000f07fe3fff0000001f8ffc1fff8000003fc7f80fff8000003fe7e00fff8000003fe1c30fff8000001ff8071fffc000000ffe1e1fffc0000007ff801fffc0000001ffc09fffc0000000ffc71fffc000007c7fcf1fffc000007e1fcf1fffc00000ff0fcf9fffc00000ffc79f8fffe00000ffe03fcffff00000fff07fcffffc00003ff8ffe7fffe00001ffcffe3ffff000007fcfff1ffff000003fdfff8ffff000000f9fffdfffe00000071fffffffe00000003fffffffc00000007fffffffc0000007ffffffff80000007ffffffff00000003ffffffff00000000fffffffe000000003ffffffc000000001ffffff80000000001fffff80000000000007fe00000000000007fc00000000000003f800000000000001f000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000""", """000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000000000000007c000000000000007e000000000001e07f000000000001f03f800000000003f83fc00000000001fc1fe00000000000fe0fe000000000007f07f000000000007f87f800600000003fc3fc00f000001e1fe1fe01f800001f0ff0fe01f800003f87f87f01fc00001fc3fc3f81fe00000fe1fe3fc1fe00000ff0ff1fc0ff000007f87f8ff0ff800003fc7f87f87f800001fe3fc7fc3f800000ff1ffffe3fc000307f8fffff3fc000383fc7fffe3fe0003c1fe3fffe3fe0003e0ff1fcfe7fe0001f07f9fcfe7fe0001fc3fff8fe7ff0000fe1fff9fcfff00007f0fff9fcffe00003f87ff1fcffe00003fc7ff3fcffe00001fe1fe3fcffe00000ff1fe7fcffe000007fffcffeffe000003fff8fffffe000001fff1fffffe0000007ff3fffffe0000003ffffffffe0000001ffffffffe00000007fffffffe00000007ffffffff00000003ffffffff00000001ffffffff00000001ffffffff80000000ffffffff800000003fffffff800000001fffffff0000000007ffffff0000000003fffffe0000000000fffffc00000000007ffff800000000000ffff0000000000001ffe00000000000000fc00000000000000f00000000000000000000000000000000000000000000000000000000000000000000""", """00000000000000000000000000000000000000000000000000000e000000000000000f000000000000001f800000000000000fc00000000000000fc000000000000007e000000000000007e000000000000007f000000000000003f800000000000001fc00000000000001fc00000000078001fe000000000ff000fe000000000ff800ff0000000007fe007f0000000003ff807fc000000001ffc07fc000000000ffe03fe0000000003ffc3ff0000000000ffe10000000000007ff83000000000000ff87e000000000007f1ffe00000000001e3fff80000000000cfffff00000000001fffffc0000000003ffbffe0000000007fe1fff0000000003f80fff000000000001c7ff800000000003e3ff800000007e0ff8ff800000007f81fc7fc00000007ff0fe7fc00000003ffc1e7fc00000003fff0e7fe00000000fffc67fe000000003ffc67fe000000000ffe63fe0000000001fe63fe00000003e03c73ff00000003fc00f3ff00000003ff01f9ff80000003ffc7f8ffc0000000ffe3fcfff00000007ff3fffff00000000ff3fffff000000003f3fffff00000000007ffffe0000000000fffffc000000000ffffffc0000000007fffff80000000003fffff00000000000ffffe000000000003fffc00000000000007f000000000000003e00000000000000180000000000000000000000000000000000000000000000000000""", """00000000000001c0000000000000000000000000000003e0000000000000000000000000000007f00000001fe00000000000000000000ff0000003ffff0000000000000000001ff000000fffffe000000000000000003ff000003ffffff800000000000000007ff00000fffffffe0000000000000000ffe00001ffffffff0000000000000001ffc00003ffffffff8000000000000003ff800007ffffffffc000000000000003ff80000fffffffffe000000000000007ff00001ffffffffff00000000000000ffe00001ffffffffff00000000003801ffc00003ffffffffff800000000fffe3ff800003ffffc7ffff800000007fffc7ff000007fffe00ffffc0000003ffff8ffe000007fff8003fffc000000fffff1ffc000007fff0003fffc000003fffff3ff8000007ffe0001fffc000007ffffe3ff800000fffe0000fffe00001fffffc7ff180000fffc0000fffe00003fffff8ffe3c0000fffc0000fffe00007fffff1ffc7e0000fffc0000fffe0000fffffe3ff8ff0000fffc0000fffc0001ffefcc7ff1ff8000fffc0000fffc0003ff8f80ffe1ffc00000000001fffc0007ff0f01ffc0ffe00000000001fffc000ffc0f01ffc03ff00000000003fff8001ff80f03ff881ff80000000003fff8001ff01f07ff180ff80000000007fff0003fe01f0ffe3807fc000000001ffff0007fc00f1ffc7003fe000000003fffe0007f800e3ff8f001fe000000007fffc000ff800c7ff1f001ff00000000ffff80007f8008ffe3f001fe00000003ffff00007fc001ffc7e003fe00000007fffc00003fe001ffcfe007fc0000000ffff800001ff003ff8fc00ff80000000fffe000001ff807ff1fc01ff80000001fffc000000ffe0ffe3f807ff00000001fff80000007ff1ffc7f00ffe00000003fff00000003fe3ff8fe01ffc00000003ffe00000001fc7ff1f807ff800000003ffc00000000f8ffe1c01fff000000003ffc0000000078ffc000fffe000000003ff80000000031ffc41ffffc000000003ff80000000003ff8ffffff8000000003ff80000000007ff1fffffe0000000000000000000000ffe3fffffc0000000000000000000001ffc7fffff00000000000000000000003ff8fffffc00000000000000000000007ff1ffffe00000000000000000000000ffe0ffff00000000000007c000000000ffe000000000000000001ff000000001ffc000000000000000003ff800000003ff8000000000000000007ff800000007ff0000000000000000007ffc0000000ffe0000000000000000007ffc0000000ffc0000000000000000007ff80000000ff80000000000000000003ff80000000ff00000000000000000001ff00000000ff000000000000000000007c000000007e0000000000000000000000000000003800000000000000000000000000000""" ) CLASSES_ = { ROCK_: "rock", PAPER_: "paper", SCISSORS_: "scissors", NOTHING_: "nothing" } ALL_CLASSES_ = list(claz for claz in CLASSES_.values()) + ["tie", "winner", "pending"] FLIPPED_SCREEN_PICTURES_ = tuple(flip_(picture, 64) for picture in SCREEN_PICTURES_) ATK_HEAD = """ <style> .hand { background-repeat: no-repeat; background-size: 100% 100%; display: inline-block; width: 94px; height: 94px; border: transparent 5px solid; } .sensitive { cursor: pointer; } .rock { background-image: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADUlKC8oITUvKy88OTU/UIVXUElJUKN1e2GFwarLyL6qurfV8P//1eL/5re6////////////zv//////////////2wBDATk8PFBGUJ1XV53/3Lrc////////////////////////////////////////////////////////////////////wAARCABeAF4DASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBAUB/8QAKhAAAgIBAwMEAQQDAAAAAAAAAQIAAxEEEiExQVETImGBMiMzobE0cZH/xAAYAQADAQEAAAAAAAAAAAAAAAAAAQIDBP/EAB4RAQEBAQACAwEBAAAAAAAAAAABEQIhMQMSMkFR/9oADAMBAAIRAxEAPwDDERAEREASTI6jLKQPkTVoUU7nPJHA+JrYAqd2Md8zLr5MuKnOxyIlt6Ij/puGU+D0lU0l1JERGCIiAIiIB6il3CjqTidBdLUFwVyfJmRKrlxYEOBzNR1QYAVKWdu3iZd230vnP6rIGjtyMlG7dxJhLNQc2ZSvsvcyddGG32ne/wDAljuqKWY4Amd6/wA9niB01JGNgma3RleazuHjvNqkMoIOQZ7FO7DslceJu1dAZTYo9w6/Mwzo56+01nZhERKIllG31l3/AI57yuTqqa1sKP8AZ8RX0I6sz2oarRci5HRgP7kVNmmwH99fkdppVldQynIM5vy19qTq6tuQST4xKrEsvRnf2KBlVlmqrHpmxRh15BE8Wl7UU22kqRnaOJUyTYV30hoA3uOTt6Y+ZsmfRfsfZmiT3+qfPonJtXZay+DOtObq/wDJf6/qX8V8l2piIm7Mm3QugQrnDE/9mKJPXP2mHLjsHkYMzNS1TF6PtPMqo1ZX228jzNVl6JXu3A+Md5hnXNxeyqN1mrUALsrzyc9ZqAAAA6CVaZClIDdTzLour5yHGek+le9R6MdyzRK76vVXg4YcgySbtg343d8QvnyIlM2p03qEun5dx5mmIpbLsOzXHIIOCMERLdS4suJHQcSqdU8xiRERgm7TLQ4DKvuHUE9JhnqsVOVODJ6mw5cdeJhr1rAYdc/Ilo1tXhh9TC8dRp9o0xKE1dbuFGRnuZfJss9nuko1V3p17Qfc38Sd1y0rk8nsJzXdrHLMeTL443zU9XEYiJ0MyIiAIiIAiIgCaV1jCrbjLeTM0RWS+zlx6zF23MckzyIjIiIgH//Z); } .paper { background-image: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADUlKC8oITUvKy88OTU/UIVXUElJUKN1e2GFwarLyL6qurfV8P//1eL/5re6////////////zv//////////////2wBDATk8PFBGUJ1XV53/3Lrc////////////////////////////////////////////////////////////////////wAARCABeAF4DASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAIDBAUB/8QAKhAAAgIBAwMEAQQDAAAAAAAAAQIAAxEEITESQVETIjJhcnGBobEzNEL/xAAYAQADAQEAAAAAAAAAAAAAAAAAAQIDBP/EACARAAICAgICAwAAAAAAAAAAAAABAhEhMQMSIjJRYXH/2gAMAwEAAhEDEQA/AMMRAGSAO8AETadCvRsx6vviZ6x6WoX1BjB3kqSeh1RBkdPkpGfIkZ12VXUhhkGcy+o0vg8djJhPsNxoriImhIiIgAiIgAklrdgWVSQO4kZ0tKytQoXtsRInLqrGlZ5prxauD8xz9z3UUC5dtmHBlWooKt6tOxG5Al1FwuXww5ExePKJf0ynS3FT6NmxHGf6mi2pbUKt+x8SvU0eoOpdnH8xprvUXpbZ15+4PPkgXwzBYjVuVbkSIGTgczpaigXJtsw4Mw0+zUL17YO+ZtGdolqmWto2Wot1ZYb4madic/V0+m/Uo9rfwZMJ26Y5RrRniImpAl1Zt0zBypCnt5lI2M6iMmoq3GQeR4kTdFRVkkdbFDKcgzPdSyN6tOxHI8yBSzSP1L7qzzNaOtihlOQZj65Wit7I02rcmRz3HiQtoLWCyshXHP3DUEXCyo9Jz7h5l8V07Q97Ez6nTer7l2f+5KuxnvsH/C7fvLLG6K2bwMwVxYbRVpLC9ZVvkm0suT1KmXzxK9IvTQD3bcy+EsSwC0cfiJZqBi9wPMrnSsoyEtouNL55U8iVRBq8AdZWWxMjBUzM6tpX603rPI8TPRe1LeVPInRR1sXKnImDTh+GidnqkMoI4IzIXWCqst37frLJQamsv6rPgvxHn7kKryNktNWa6hn5NuZ5qv8AWfEuggEYIyIXmwrFEKtqU/EScREM5V5ze/5GQk7v81n5H+5XOtaMWexERgJOm1qnDDjuPMhEGrA6yMHUMpyDJTl03tSdt17idCq5LRlTv3Hec0oOJqnZZERIGIiIAc7WV9FxPZt5nmnWXCxwq8L3madUbrJk9nsREoQiIgAgEqcg4P1E8gBqr1rqMOOr74MuXW1k4IYTnxIfHFldmdjIxnIx5mPU6oEFKz+rTKXYqFLEgcDMjJjxpZYOQiImpJ//2Q==); } .scissors { background-image: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADUlKC8oITUvKy88OTU/UIVXUElJUKN1e2GFwarLyL6qurfV8P//1eL/5re6////////////zv//////////////2wBDATk8PFBGUJ1XV53/3Lrc////////////////////////////////////////////////////////////////////wAARCABeAF4DASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAEDBAUC/8QAKRAAAgIBAwQCAgEFAAAAAAAAAQIAAxEEITESE0FRInEygaEzQmFisf/EABgBAAMBAQAAAAAAAAAAAAAAAAACAwEE/8QAHREAAgICAwEAAAAAAAAAAAAAAAECESExAxJBIv/aAAwDAQACEQMRAD8AowhCABJKKTc+M4A5Mjk2ks6LgDw20yV1g1bFqKDSRvlTwZDNa2sWVlT5mWylGKtyIkJdlk2SoUIRSgo4RRwAIQhABohscKvJlltCwHxcE+iMSvW5rcMORNGnUJbsDhvRk5uS0NFJma6MjYYEGKaz1rYuHGRKN2kZN0+S/wAiEeRPYONFyizuVK3ng/ch1tPUvcUbjn6kWhs6XKHhuPuXjjgyT+JDLKMeEsamjtNlfwP8SvOhO1aJtUEIQmgEcUIAOEIoAWqdYybWfIe/MupYti5Q5EyJ3WQHGWKg8kScuNPKGUi3cEe0Clc2g5JHA+52NKrDNrFnPJzJKu0iYrK4+5zZqUXZPm3gLJ29Ial6cNpD0lVtYA+DuJVs01te5XI9iXabuslHHTYORJod5R2FJmNCaOp06ujMow4328zOloyUkI1QQhCMYOKEIAE1EppNYwikY5xMuT6ey5P6all8jGREmm1gaLJ7NEp3rPSfR4glnY2spC/7KJ2mqRjhwUb0ZPsw8EGRbepDUvCJ0r1ChlbccMPEKLHZnR8Ep5HmcdAp1KCvYPnKx1/HWWqf7gCIeAWJl6hO3cy+ORNSUteu6P8AqbxumElgpwhCdBMcUcIAKX9JcnbCEhWHvzKMUWUeyo1OjXetLBh1BlW3TNWC9LsAORmV6r7K8ANt6PEuF73TArUZH5dW0lUose0zqitQBYGLlh+TRXo3UttYyy+PYklSdutUznE7iXmzawE4trW1Olv0fU7iJABJOAIqNMq2tqn6W/R9zmSX2920t44EinWrrJFjhCE0AijigASanUPVwcr6MhjmNXsDQTWVMPllT/mSJdW7dKsCZlwBIIIOCJN8S8G7M12YKCWOAJQ1OpNvxXZP+yGy17Dl2JnM2PHWWDlYo4oSgp//2Q==); } .nothing { background-image: url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADUlKC8oITUvKy88OTU/UIVXUElJUKN1e2GFwarLyL6qurfV8P//1eL/5re6////////////zv//////////////2wBDATk8PFBGUJ1XV53/3Lrc////////////////////////////////////////////////////////////////////wAARCABeAF4DASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAT/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/2Q==); } .winner { border-color: red; } .tie { border-color: transparent; } .pending { border-color: transparent; } </style> """ BODY_ = """ <fieldset> <legend id="Title"></legend> <fieldset> <div style="white-space: nowrap;"> <span id="0" xdh:onevent="Click" class="hand sensitive rock"></span> <span id="1" xdh:onevent="Click" class="hand sensitive paper"></span> <span id="2" xdh:onevent="Click" class="hand sensitive scissors"></span> </div> <br /> <div style="display: flex;"> <h2 style="margin:auto;" id="Status"></h2> </div> <br /> <div style="display: flex;"> <button xdh:onevent="AIMove" style="margin:auto; width: 5em; font-size: larger;">🤖</button> </div> </fieldset> <fieldset> <div style="width: 100%;"> <div style="display: flex; justify-content: space-around;"> <span id="Player1" style="transform: scaleX(-1)" class="hand nothing pending"></span> <span id="Player2" class="hand nothing pending"></span> </div> <br /> <fieldset style="display: flex; justify-content: space-around;"> <span id="Score1"></span> <span id="Score"></Span> <span id="Score2"></span> </fieldset> </fieldset> <br> <div style="display: flex;"> <button xdh:onevent="New" style="margin: auto;" id="New"></button> </div> </fieldset> """ setAllLedGroups_() atlastk.launch(globals=globals())

Morpion#

Le jeu du morpion.

import atlastk, ucuq, random, math panel = ucuq.ravel.panel ring = ucuq.ravel.ring buzzer = ucuq.ravel.buzzer screen = ucuq.ravel.screen RING_MAX = 5 CROSS_COLOR = (0, RING_MAX, 0) CIRCLE_COLOR = (0, 0, RING_MAX) TIE_COLOR = (RING_MAX, RING_MAX, 0) SOUND_DELAY = 0.5 CROSS_SOUND = "C42" CIRCLE_SOUND = "F42" TIE_SOUND = "F42 E42 D42 C43" WIN_SOUND = "C42 D42 E42 F43" INTRO_SOUND = "F43 G42 A42 Bb42 C52 D52 E52 F53" W_AI_MOVE = "AIMove" W_CLEAR = "Clear" currentPlayer = "" winningCombos = [] board = None def soundCallback(freq): if freq != -1: buzzer.off() if freq != 0: buzzer.on(freq) if currentPlayer == "": for led in range(8): ring.setValue( led, tuple( int(math.exp(random.uniform(0, math.log(RING_MAX)))) for _ in range(3) ), ) ring.write() def soundPlay(sound): ucuq.sleepStart() ucuq.playVoices((sound,), 120, lambda freq: soundCallback(freq), lambda tracking: (ucuq.sleepWait(tracking.duration), ucuq.sleepStart())) def screenGrid(): screen.fill(0).rect(30, 0, 64, 64, 1).hLine(31, 21, 63, 1).hLine(31, 42, 63, 1).vLine(51, 0, 63, 1).vLine(72, 0, 63, 1).show() def screenConvert(i, j): return (41 + 21 * int(j), 11 + 21 * int(i)) def screenCircle(i, j): x, y = screenConvert(i, j) screen.ellipse(x, y, 6, 6, 1, False).show() def screenCross(i, j): x, y = screenConvert(i, j) screen.line(x - 5, y - 5, x + 5, y + 5, 1).line(x - 5, y + 5, x + 5, y - 5, 1).show() def screenWin(combo): def sign(a, b): return (a < b) - (a > b) x1, y1 = screenConvert(*combo[0]) x2, y2 = screenConvert(*combo[2]) ox = 9 * sign(x1, x2) oy = 9 * sign(y1, y2) screen.line(x1 - ox, y1 - oy, x2 + ox, y2 + oy, 1).show() def initWinningCombos(): global winningCombos for i in range(3): winningCombos.append(tuple((i, j) for j in range(3))) winningCombos.append(tuple((j, i) for j in range(3))) winningCombos.append(tuple((i, i) for i in range(3))) winningCombos.append(tuple((i, 2 - i) for i in range(3))) async def setStatus(dom, text): if dom.isMaster: text = " " * 16 + text.replace("…", "...") + " " for _ in range(16): text = text[1:] panel.moveTo(0, 1).putString(text[:16]) ucuq.sleep(0.01) await dom.setValue("Status", text) def newGame(): global currentPlayer, board currentPlayer = "" panel.moveTo(0, 1).putString(" " * 16) board = [["" for _ in range(3)] for _ in range(3)] screenGrid() soundPlay(INTRO_SOUND) ring.fill((0, 0, 0)) currentPlayer = "x" def getWinner(board): for combo in winningCombos: values = [board[i][j] for i, j in combo] if values[0] != "" and len(set(values)) == 1: return (values[0], combo) for i in range(3): for j in range(3): if board[i][j] == "": return (None, None) return ("", None) async def atkbDisplay(dom): global currentPlayer crossCount = 0 circleCount = 0 removedClasses = {} addedClasses = {} for i in range(3): for j in range(3): await dom.setValue(f"cell{i}{j}", board[i][j]) match board[i][j]: case "x": if dom.isMaster: screenCross(i, j) ring.setValue(1 - crossCount, CROSS_COLOR) crossCount += 1 removedClasses[f"cell{i}{j}"] = ["o", "win"] addedClasses[f"cell{i}{j}"] = "x" case "o": if dom.isMaster: screenCircle(i, j) ring.setValue(2 + circleCount, CIRCLE_COLOR) circleCount += 1 removedClasses[f"cell{i}{j}"] = ["x", "win"] addedClasses[f"cell{i}{j}"] = "o" case "": removedClasses[f"cell{i}{j}"] = ["x", "o", "win"] winner, combo = getWinner(board) if winner is not None: addedClasses[W_AI_MOVE] = "hidden" removedClasses[W_CLEAR] = "hidden" else: removedClasses[W_AI_MOVE] = "hidden" addedClasses[W_CLEAR] = "hidden" await dom.removeClasses(removedClasses) await dom.addClasses(addedClasses) if combo: await dom.addClasses(dict(zip([f"cell{i}{j}" for i, j in combo], ["win"] * 3))) if dom.isMaster: screenWin(combo) ring.fill(CROSS_COLOR if winner == "x" else CIRCLE_COLOR).write() soundPlay(WIN_SOUND) await setStatus(dom, dom.getL10n(6).format(winner.lower())) currentPlayer = "" return elif winner == "": if dom.isMaster: ring.fill(TIE_COLOR).write() soundPlay(TIE_SOUND) await setStatus(dom, dom.getL10n(5)) currentPlayer = "" return if dom.isMaster: if crossCount + circleCount: ring.write() await setStatus(dom, dom.getL10n(4).format(currentPlayer.lower())) async def atk(dom): await dom.inner("", BODY) await dom.setValues({"Title": dom.getL10n(1), "Clear": dom.getL10n(3)}) dom.isMaster = board is None if dom.isMaster: panel.clear().backlightOn().moveTo(0, 0).putString(dom.getL10n(2)) newGame() await atkbDisplay(dom) async def atkNew(dom): newGame() atlastk.broadcastAction(atkbDisplay) def move(moves): global currentPlayer if currentPlayer == "": return i, j = moves[random.randrange(len(moves))] if board[i][j] == "": soundPlay(CROSS_SOUND if currentPlayer == "x" else CIRCLE_SOUND) board[i][j] = currentPlayer currentPlayer = "o" if currentPlayer == "x" else "x" atlastk.broadcastAction(atkbDisplay) async def atkClick(dom, id): i = int(id[4]) j = int(id[5]) move(((i, j),)) def minimax(board, player): winner, _ = getWinner(board) match winner: case "x": return -1 case "o": return 1 case "": return 0 if player == "o": score = -2 for i in range(3): for j in range(3): if board[i][j] == "": board[i][j] = "o" score = max(score, minimax(board, "x")) board[i][j] = "" return score else: score = 2 for i in range(3): for j in range(3): if board[i][j] == "": board[i][j] = "x" score = min(score, minimax(board, "o")) board[i][j] = "" return score def bestMoves(board, player): bestScore = -2 if player == "o" else 2 for i in range(3): for j in range(3): if board[i][j] == "": board[i][j] = player score = minimax(board, "x" if player == "o" else "o") board[i][j] = "" if score == bestScore: moves.append((i, j)) elif (player == "o") ^ (score < bestScore): bestScore = score moves = [(i, j)] return moves def noCircle(board): xMove = (0, 0) for i in range(3): for j in range(3): match board[i][j]: case "o": return None case "x": xMove = (i, j) return xMove async def atkAIMove(dom): if currentPlayer == "": return xMove = noCircle(board) if xMove is None: move(bestMoves(board, currentPlayer)) elif currentPlayer == "x": move(((random.randrange(3), random.randrange(3)),)) else: angles = tuple((i, j) for i in (0, 2) for j in (0, 2)) if xMove == (1, 1): move(angles) elif xMove in angles: move(((1, 1),)) else: moves = ((0, 0), (0, 2), (2, 1), (1, 1)) if xMove == (1, 0): moves = tuple((j, i) for i, j in moves) elif xMove == (2, 1): moves = tuple((abs(i - 2), j) for i, j in moves) elif xMove == (1, 2): moves = tuple((j, abs(i - 2)) for i, j in moves) move(moves) ATK_L10N = ( ("en", "fr", "de"), ("Tic-tac-toe", "Morpion", "Dodelschach"), ("Tic-tac-toe game", " Jeu du morpion ", " Dodelschach "), ("Clear", "Effacer", "Löschen"), ("To player {}…", "Au joueur {}…", "An Spieler {}…"), ("It's a tie!", "Match nul !", "Unentschieden!"), ("Winner: {}!", "Vainqueur : {} !", "Sieger: {}!"), ) initWinningCombos() ATK_HEAD = """ <link href="https://fonts.googleapis.com/css?family=Indie+Flower" rel="stylesheet"> <style> h1, h2 { font-family: 'Indie Flower', 'Comic Sans', cursive; text-align: center; margin: 10px; } #board { font-family: 'Indie Flower', 'Comic Sans', cursive; position: relative; font-size: 120px; margin: 1% auto; border-collapse: collapse; } #board td { border: 4px solid rgb(60, 60, 60); width: 90px; height: 90px; vertical-align: middle; text-align: center; cursor: pointer; } #board td div { width: 90px; height: 90px; line-height: 90px; display: block; overflow: hidden; cursor: pointer; position: relative; font-size: 1.2em; } .x { color: lightgreen; cursor: default !important; } .o { color: lightblue; cursor: default !important; } .win { background-color: yellow; } .hidden { display: none; } </style> """ BODY = """ <h1 id="Title"></h1> <fieldset> <table id="board"> <tbody> <tr> <td> <div id="cell00" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell01" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell02" class="cell" xdh:onevent="Click"></div> </td> </tr> <tr> <td> <div id="cell10" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell11" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell12" class="cell" xdh:onevent="Click"></div> </td> </tr> <tr> <td> <div id="cell20" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell21" class="cell" xdh:onevent="Click"></div> </td> <td> <div id="cell22" class="cell" xdh:onevent="Click"></div> </td> </tr> </tbody> </table> <h2 id="Status"></h2> <div style="display: flex;"> <button xdh:onevent="AIMove" style="margin:auto; width: 5em; font-size: larger;" id="AIMove">🤖</button> <button xdh:onevent="New" style="margin: auto;" class="hidden" id="Clear"></button> </div> </fieldset> """ atlastk.launch(globals=globals())

Divers#

Multi-composants#

Orientation#

Cette application ne fonctionne que sur un dispositif mobile (tablette, smartphone…) équipé des capteurs appropriés et affiche un cube 3D représentant l’orientation du dispositif.

Cette application doit être ouverte dans son propre onglet pour fonctionner (cliquer sur dans l’encart ci-dessous) !

import atlastk import ucuq import math WIDTH_ = 128 HEIGHT_ = 64 buffer_ = [[0]*WIDTH_ for _ in range(HEIGHT_)] def setPixel_(x, y): if 0 <= x < WIDTH_ and 0 <= y < HEIGHT_: buffer_[y][x] = 1 def drawLine_(x0, y0, x1, y1): dx = abs(x1 - x0) dy = -abs(y1 - y0) sx = 1 if x0 < x1 else -1 sy = 1 if y0 < y1 else -1 err = dx + dy while True: setPixel_(x0, y0) if x0 == x1 and y0 == y1: break e2 = 2 * err if e2 >= dy: err += dy x0 += sx if e2 <= dx: err += dx y0 += sy def rotatePoint_(x, y, z, pitch, roll, yaw): p = math.radians(pitch) r = math.radians(roll) w = math.radians(yaw) # Pitch (X) y2 = y * math.cos(p) - z * math.sin(p) z2 = y * math.sin(p) + z * math.cos(p) # Yaw (Y) x3 = x * math.cos(w) + z2 * math.sin(w) z3 = -x * math.sin(w) + z2 * math.cos(w) # Roll (Z) x4 = x3 * math.cos(r) - y2 * math.sin(r) y4 = x3 * math.sin(r) + y2 * math.cos(r) return x4, y4, z3 def project_(x, y, z, scale=40): distance = 3 factor = scale / (z + distance) xp = int(WIDTH_/2 + x * factor) yp = int(HEIGHT_/2 - y * factor) return xp, yp cubeVertices_ = [ (-1,-1,-1), (1,-1,-1), (1,1,-1), (-1,1,-1), (-1,-1, 1), (1,-1, 1), (1,1, 1), (-1,1, 1) ] cubeEdges_ = [ (0,1),(1,2),(2,3),(3,0), (4,5),(5,6),(6,7),(7,4), (0,4),(1,5),(2,6),(3,7) ] def clearBuffer_(): for y in range(HEIGHT_): for x in range(WIDTH_): buffer_[y][x] = 0 def bufferToHex_(): hex_string = [] for y in range(HEIGHT_): for x in range(0, WIDTH_, 4): nibble = ( (buffer_[y][x] << 3) | (buffer_[y][x+1] << 2) | (buffer_[y][x+2] << 1) | (buffer_[y][x+3] << 0) ) hex_string.append(f"{nibble:X}") return "".join(hex_string) def draw3DCube(x, y, z): """ x = alpha (0–360°) → yaw y = beta (-180–180°) → pitch z = gamma (-90–90°) → roll """ yaw = -x pitch = -y roll = -z clearBuffer_() projected = [] for (vx, vy, vz) in cubeVertices_: xr, yr, zr = rotatePoint_(vx, vy, vz, pitch, roll, yaw) xp, yp = project_(xr, yr, zr) projected.append((xp, yp)) for a, b in cubeEdges_: x0, y0 = projected[a] x1, y1 = projected[b] drawLine_(x0, y0, x1, y1) return bufferToHex_() async def atk(dom): global panel_, screen_ panel_ = ucuq.ravel.panel screen_ = ucuq.ravel.screen await dom.inner("", BODY) async def atkDisplayOrientation(dom, values): x, y, z = (float(value) for value in values.split(",")) panel_.backlightOn().moveTo(0, 0).putString(f"{f"{int(z):+3d} {int(x):4d} {int(y):+4d}".center(16)}".ljust(32)) screen_.draw(draw3DCube(x, y, z), 128).show() ATK_HEAD = """ <script> async function getOrientation() { if (!window.DeviceOrientationEvent || !window.DeviceOrientationEvent.requestPermission) { return alert("Your current device does not have access to the DeviceOrientation event"); } let permission = await window.DeviceOrientationEvent.requestPermission(); if (permission !== "granted") { return alert("You must grant access to the device's sensor for this demo"); } } var previousTime = 0; window.addEventListener("deviceorientation", function (e) { let x = Math.round(e.alpha); let y = Math.round(e.beta); let z = Math.round(e.gamma); document.getElementById('PartnerOrientationX').innerHTML = `${x}°`; document.getElementById('PartnerOrientationY').innerHTML = `${y}°`; document.getElementById('PartnerOrientationZ').innerHTML = `${z}°`; if ((performance.now() - previousTime) < 333) return; previousTime = performance.now(); launchEvent(`${x},${y},${z}|BUTTON|click||(DisplayOrientation)`); }); </script> """ BODY = """ <fieldset style="display: flex; justify-content: space-around;"> <legend>Orientation</legend> <span> <span>Z: </span> <output style="display: inline-block; font-family: monospace; width: 4ch; font-size: larger;" id="PartnerOrientationZ"></output> </span> <span> <span>X: </span> <output style="display: inline-block; font-family: monospace; width: 4ch; font-size: larger;" id="PartnerOrientationX"></output> </span> <span> <span>Y: </span> <output style="display: inline-block; font-family: monospace; width: 4ch; font-size: larger;" id="PartnerOrientationY"></output> </span> </fieldset> """ atlastk.launch(globals=globals())

Multi-évènements#

Application qui fait clignoter des leds et scroller du texte de manière régulière, mais à des rythmes différents.

import ucuq DURATION = 15 RING_INTENSITY = 10 def ringEvents(ring, delay, color, positions): elapsed = 0 switch = False while elapsed < DURATION: for position in positions: ring.setValue(position, color if switch else (0,0,0)) ring.write() switch = not switch elapsed += delay yield delay def panelEvents(panel, line, text, delay): elapsed = 0 text = text.rjust(16) position = 0 while elapsed <= DURATION: panel.moveTo(0,line).putString(text[position:] + text[:position]) yield delay position = (position + 1) % 16 elapsed += delay def main(): ring = ucuq.ravel.ring panel = ucuq.ravel.panel.backlightOn() allEvents = ( ringEvents(ring, 1, (RING_INTENSITY,0,0), (0,1)), ringEvents(ring, 2/3, (0,RING_INTENSITY,0), (2,3)), ringEvents(ring, 2/5, (0,0,RING_INTENSITY), (4,5)), ringEvents(ring, 2/7, (RING_INTENSITY,RING_INTENSITY,0), (6,7)), panelEvents(panel, 0, "3 scrolls/s", 1/3), panelEvents(panel, 1, "4 scrolls/s", 1/4) ) ucuq.sleepStart() ucuq.dispatchEvents(allEvents, lambda tracking: ucuq.sleepWait(tracking.cumul)) ring.fill((0,0,0)).write() panel.backlightOff().clear() main()

Servomoteurs#

import random, ucuq screen = ucuq.ravel.screen panel = ucuq.ravel.panel ring = ucuq.ravel.ring upper = ucuq.ravel.upper lower = ucuq.ravel.lower import random import ucuq STEP_MIN_ = 100 STEP_MAX_ = 250 DURATION_ = 10 DELAY_ = 1 / 10 COMMIT_DELAY_ = 1 / 15 MAX_ = ucuq.ravel.SERVO_MAX WIDTH_ = ucuq.ravel.PANEL_WIDTH * 5 COLOR_MAX_ = ucuq.ravel.RING_MAX // 7 SPEED_COLORS_ = ((0, COLOR_MAX_, 0), (COLOR_MAX_, COLOR_MAX_, 0), (COLOR_MAX_, COLOR_MAX_ // 3, 0), (COLOR_MAX_, 0, 0)) def setRing_(ring, step, list): pos = len(list) * (step - STEP_MIN_) // (STEP_MAX_ + 1 - STEP_MIN_) for i in range(0, pos + 1): ring.setValue(list[i][0], list[i][1]) if pos < len(list): for i in range(pos + 1, len(list)): ring.setValue(list[i][0], (0,0,0)) ring.write() def setScreenDots_(screen, value1, value2, pos, col): pos = ucuq.ravel.SCREEN_WIDTH - 1 - pos return screen\ .pixel(pos, value1 * ( ucuq.ravel.SCREEN_HEIGHT // 2 - 1 ) // ( MAX_ - 1 ), col )\ .pixel(pos, ucuq.ravel.SCREEN_HEIGHT // 2 + value2 * ( ucuq.ravel.SCREEN_HEIGHT // 2 - 1 ) // ( MAX_ - 1 ), col ) def setScreen_(screen, data0, data1, pos): if pos == 0: setScreenDots_(screen, data0[0], data1[0], pos, 1).show() else: max = min(pos, ucuq.ravel.SCREEN_WIDTH - 1) for i in range(max+1): p = pos - i setScreenDots_(screen, data0[p-1], data1[p-1], i ,0) setScreenDots_(screen, data0[p], data1[p], i ,1) screen.show() def servosEvents_(servo, panel): elapsed = 0 current = park = servo.get() rising = current == 0 target = random.randrange(MAX_) events = [] step = random.randrange(STEP_MIN_, STEP_MAX_ + 1) parking = False ringData = [] screenData = [] ringDelay = 0 while True: if elapsed > DURATION_: if parking and current == park: break target = park rising = park != 0 parking = True ringData.append((step, ringDelay)) ringDelay = 0 step = STEP_MAX_ if rising: current = min(current + step, target) if not parking and current >= target: rising = False target = random.randrange(0, current + 1) ringData.append((step, ringDelay)) ringDelay = 0 step = random.randrange(STEP_MIN_, STEP_MAX_ + 1) else: current = max(current - step, target) if not parking and current <= target: rising = True target = random.randrange(current + 1, MAX_) ringData.append((step, ringDelay)) ringDelay = 0 step = random.randrange(STEP_MIN_, STEP_MAX_ + 1) screenData.append(current) events.append((lambda pos = current, step = step: (servo.set(pos), panel[0].moveTo(0, panel[1]).putString(panel[0].getForwardPeak(WIDTH_ * pos // (MAX_ + 1), WIDTH_))), DELAY_)) elapsed += DELAY_ ringDelay += DELAY_ ringData.append((step, ringDelay)) return events, ringData, screenData def getRingEvents_(ring, data, list): events = [] for item in data: events.append((lambda item = item: setRing_(ring, item[0], list), item[1])) return events def getScreenEvents_(screen, data0, data1): events = [] for i in range(len(data0)): events.append((lambda i = i: setScreen_(screen, data0, data1, i), DELAY_)) return events def extend_(array, n): return array + [array[-1]] * (n - len(array)) if len(array) < n else array def sleepCallback(tracking, user): if tracking.cumul - user.timestamp > COMMIT_DELAY_: ucuq.commit() user.timestamp = tracking.cumul ucuq.sleepWait(tracking.cumul) def main(): ringEvents= [] screenEvents = [] ledUpper = tuple((i, SPEED_COLORS_[i]) for i in range(4)) ledLower = tuple((7 - i, SPEED_COLORS_[i]) for i in range(4)) upperEvents, ringData, screenData0 = servosEvents_(upper, (panel, 0)) ringEvents.append(getRingEvents_(ring, ringData, ledUpper)) lowerEvents, ringData, screenData1 = servosEvents_(lower, (panel, 1)) ringEvents.append(getRingEvents_(ring, ringData, ledLower)) maxAmountOfScreenData= max(len(screenData0), len(screenData1)) screenData0 = extend_(screenData0, maxAmountOfScreenData) screenData1 = extend_(screenData1, maxAmountOfScreenData) screenEvents = getScreenEvents_(screen, screenData0, screenData1) eventList = (upperEvents, lowerEvents, *ringEvents, screenEvents) panel.uploadHPeakChars().backlightOn() cb = ucuq.setCommitBehavior(ucuq.CB_MANUAL) ucuq.sleepStart() ucuq.playEvents(eventList, sleepCallback,timestamp = 0) upper.park() lower.park() ucuq.setCommitBehavior(cb) ucuq.commit() main()

Blockly#

Ring (anneau RVB)#

&lt;xml xmlns=&#34;https://developers.google.com/blockly/xml&#34;&gt; &lt;variables&gt; &lt;variable id=&#34;OH%+33!xv~H_VE2I*IFg&#34;&gt;Max&lt;/variable&gt; &lt;variable id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/variable&gt; &lt;variable id=&#34;qakBcuvE)(5VIJ~MxT%U&#34;&gt;i&lt;/variable&gt; &lt;variable id=&#34;Tc2YCbeE.]#i5=97yMY`&#34;&gt;R&lt;/variable&gt; &lt;variable id=&#34;iz(~/tY;05uh0vB;%`|y&#34;&gt;G&lt;/variable&gt; &lt;variable id=&#34;DJ[C3%2d}.nMbMGI#Mb0&#34;&gt;B&lt;/variable&gt; &lt;/variables&gt; &lt;block type=&#34;variables_set&#34; id=&#34;0IDKu1B8DUE.VyTnI_$$&#34; x=&#34;13&#34; y=&#34;13&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;OH%+33!xv~H_VE2I*IFg&#34;&gt;Max&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;ring_max&#34; id=&#34;07uXof=q117-_Aa9wjoj&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;ring_fill&#34; id=&#34;AJjePJ5Y$RI:mNtU^+r[&#34; x=&#34;20&#34; y=&#34;85&#34;&gt; &lt;value name=&#34;R&#34;&gt; &lt;shadow type=&#34;ring_fill_r&#34; id=&#34;=.dzle7mpA?VWG120vi.&#34;&gt; &lt;field name=&#34;R&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;a-u9J*^ig]Fp)dBmI4R5&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;OH%+33!xv~H_VE2I*IFg&#34;&gt;Max&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;G&#34;&gt; &lt;shadow type=&#34;ring_fill_g&#34; id=&#34;}3O`sZ_NI]nU$piMrZ;j&#34;&gt; &lt;field name=&#34;G&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;ring_fill_b&#34; id=&#34;hyQshab:$+5]/zP,}!u*&#34;&gt; &lt;field name=&#34;B&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_write&#34; id=&#34;^S;rS!tl|N@=OMuh6l5!&#34;&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;4D{8zV_#Pj,kr0Bao1,p&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;%aVhfAVRp1CDsmmy4g(d&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_fill&#34; id=&#34;ka/)-CfZk6g_(X5!LA|u&#34;&gt; &lt;value name=&#34;R&#34;&gt; &lt;shadow type=&#34;ring_fill_r&#34; id=&#34;=.dzle7mpA?VWG120vi.&#34;&gt; &lt;field name=&#34;R&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;G&#34;&gt; &lt;shadow type=&#34;ring_fill_g&#34; id=&#34;P`tm1w/{NIEGuV],*jo.&#34;&gt; &lt;field name=&#34;G&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;e?Dw@*?.OdZz6X]Gzq#%&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;OH%+33!xv~H_VE2I*IFg&#34;&gt;Max&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;ring_fill_b&#34; id=&#34;{Ah+U~d4~]gT{}z`l_Y,&#34;&gt; &lt;field name=&#34;B&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_write&#34; id=&#34;8RX323h(v,uFh.nEt86(&#34;&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;[YOsR#y!RY#imo`RWG+Q&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;o=Um_Vi^IuG5K-byaXt!&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_fill&#34; id=&#34;zi$%0uO}8_U^5^0abfU$&#34;&gt; &lt;value name=&#34;R&#34;&gt; &lt;shadow type=&#34;ring_fill_r&#34; id=&#34;_g,;2vX2SI/{,XxJSus;&#34;&gt; &lt;field name=&#34;R&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;G&#34;&gt; &lt;shadow type=&#34;ring_fill_g&#34; id=&#34;7#GW(N~Q)|A%9dC9?J~$&#34;&gt; &lt;field name=&#34;G&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;ring_fill_b&#34; id=&#34;mEYZ7m|@2Ry-_%!~xVun&#34;&gt; &lt;field name=&#34;B&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;UtF?iL*2jCRjmwIM,.,-&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;OH%+33!xv~H_VE2I*IFg&#34;&gt;Max&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_write&#34; id=&#34;U4;c9--fAxvr_[pAzTaa&#34;&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;;XdYo7)@1NQ!)veY#kS_&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;WpAl.jjU7D%Yb%gfGNp*&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;block type=&#34;controls_for&#34; id=&#34;y=[AVWqJwzI][QaWoB]^&#34; x=&#34;13&#34; y=&#34;688&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/field&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;cBjI8XZ0Lizb{2%R`=p_&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;16&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;r@FI$#Q9BvZJ=Z;E8fj~&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;BY&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;ps~G?j,B/M15U?hf,TBN&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;-2&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;controls_for&#34; id=&#34;nOw51?F7z-[V*PQlFV51&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qakBcuvE)(5VIJ~MxT%U&#34;&gt;i&lt;/field&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;u$cn99-J7Fto?Kos+O}m&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;.aR{y=n[.C`z.HDqZNth&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;7&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;BY&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;uCOH?2c#[N5~Ll5r%nl#&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;variables_set&#34; id=&#34;)PM!9~z[!rbK;BGhr~lF&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Tc2YCbeE.]#i5=97yMY`&#34;&gt;R&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;B)!at$t~r`@Hp_aS:4Vr&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;7!Z%B(H{$)Zo0j5nIz;P&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;iz(~/tY;05uh0vB;%`|y&#34;&gt;G&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;N(II,jip[!+ruAqJA@]D&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;7$U4x%jVWbf(8[btsSt$&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;DJ[C3%2d}.nMbMGI#Mb0&#34;&gt;B&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;QMbCN3%YZUfRvPS3R;@|&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;controls_whileUntil&#34; id=&#34;]t?sygy!a/J^Rxn9iaO#&#34;&gt; &lt;field name=&#34;MODE&#34;&gt;WHILE&lt;/field&gt; &lt;value name=&#34;BOOL&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;?Df_$fZ2flSIYz[D8]3g&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;vpr!V$L57Wqgi7p3c^RL&#34;&gt; &lt;field name=&#34;OP&#34;&gt;NEQ&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;9}G;dHVJt0vDC8F#lA2n&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;Q2P:AF]`=ILSCh)4$+Cc&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;sJSFHXalhv_?tVh;9v_Y&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;lxGV[I!KNTTa|%|=u(dC&#34;&gt; &lt;field name=&#34;OP&#34;&gt;EQ&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;Y@RCdJ6tKuYX@[/$:E_u&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Tc2YCbeE.]#i5=97yMY`&#34;&gt;R&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;mPJnI%ID8c]`fLeN(Jtc&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;`4ANgr`/,O(:_k%4!XUP&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;hvh^/u=Y)0Ci-`HdFkm-&#34;&gt; &lt;field name=&#34;OP&#34;&gt;EQ&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;9RXj}C3}DPL$lG{O-4lt&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;iz(~/tY;05uh0vB;%`|y&#34;&gt;G&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;$obv;I8I~E+Kb)u3dIEs&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;em*MWm^|3Wz]wS+Bc[%N&#34;&gt; &lt;field name=&#34;OP&#34;&gt;EQ&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;*im+X%OPYWNV7$x|Ou)Y&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;DJ[C3%2d}.nMbMGI#Mb0&#34;&gt;B&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;YS?X_KgE+XqS$G:95adu&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;variables_set&#34; id=&#34;S/]u]dqyimCSA_}.DOdE&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Tc2YCbeE.]#i5=97yMY`&#34;&gt;R&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_random_int&#34; id=&#34;(q!AOWPq`jdx19SUN$Lq&#34;&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;P`4ikK|Iq];A7IdiOj_P&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;fRt}F5?s)rWoZzL2v]8e&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;100&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;IwGt;hg9}0e?tg4y;xMB&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;KSW|PGvW9o1L`ml2)Tt)&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;iz(~/tY;05uh0vB;%`|y&#34;&gt;G&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_random_int&#34; id=&#34;]C_r.L3f2tfy%6|AMTr)&#34;&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;MvOiKJaLml4V]bVz;-OW&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;fRt}F5?s)rWoZzL2v]8e&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;100&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;buY~iiX$J{%6vw^.6Kyb&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;EiWCNePUhcmLih-r*k14&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;DJ[C3%2d}.nMbMGI#Mb0&#34;&gt;B&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_random_int&#34; id=&#34;@jlnlm5(3^{bC`*Z({}c&#34;&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;I;~b_U$/P)@bkVCIl`).&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;fRt}F5?s)rWoZzL2v]8e&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;100&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;kRmyEAfarwVFI[q-AM#j&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;%cGA9e[V+Hsz-z@`6b=L&#34;&gt;c&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;next&gt; &lt;block type=&#34;ring_setValue&#34; id=&#34;c=g+ptq~Zz=Z8%8l@jZu&#34;&gt; &lt;value name=&#34;INDEX&#34;&gt; &lt;shadow type=&#34;ring_setValue_index&#34; id=&#34;s9Ts?H6%#Zb==JN*jpW:&#34;&gt; &lt;field name=&#34;INDEX&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;u17=),|jtLo|=tDPC;i*&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qakBcuvE)(5VIJ~MxT%U&#34;&gt;i&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;R&#34;&gt; &lt;shadow type=&#34;ring_setValue_r&#34; id=&#34;Ewt3.2]L#8lzfA0#f*AD&#34;&gt; &lt;field name=&#34;R&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;:$~o%v(~iW]DzPBM3xc`&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Tc2YCbeE.]#i5=97yMY`&#34;&gt;R&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;G&#34;&gt; &lt;shadow type=&#34;ring_setValue_g&#34; id=&#34;f{;pL_NDOQcvHm./V]{Y&#34;&gt; &lt;field name=&#34;G&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;=).ZI.*nIW/`:](xjW@K&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;iz(~/tY;05uh0vB;%`|y&#34;&gt;G&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;ring_setValue_b&#34; id=&#34;l8%8j1v+NKv+aiAJ5q^4&#34;&gt; &lt;field name=&#34;B&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;U@KVUdaO]cH!;G-2.ZjB&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;DJ[C3%2d}.nMbMGI#Mb0&#34;&gt;B&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ring_write&#34; id=&#34;7sQFSyUfD-`ZLfdG:SMQ&#34;&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;8X#F1HV^(aPtG1e9HVlr&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;%S/#vE!#Jb%rc8.]r@/_&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;0.075&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;/xml&gt;

LCD (afficheur LCD)#

&lt;xml xmlns=&#34;https://developers.google.com/blockly/xml&#34;&gt; &lt;variables&gt; &lt;variable id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/variable&gt; &lt;variable id=&#34;HOaXZA:Qn4+rp4WvXUls&#34;&gt;Delay&lt;/variable&gt; &lt;variable id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/variable&gt; &lt;variable id=&#34;ibYSTe:27[-s?IZ$/[P1&#34;&gt;Blank&lt;/variable&gt; &lt;variable id=&#34;ms/6($YO*/BKvA:[N7LH&#34;&gt;Line1&lt;/variable&gt; &lt;variable id=&#34;C2.i$o:.CGmHAK~=6@Hp&#34;&gt;Line2&lt;/variable&gt; &lt;variable id=&#34;Y)Mc:KXD3,mxdyRX.xNV&#34;&gt;Message&lt;/variable&gt; &lt;variable id=&#34;8!0pa[Oc~za|8TKPF|{n&#34;&gt;j&lt;/variable&gt; &lt;/variables&gt; &lt;block type=&#34;variables_set&#34; id=&#34;xIXhrO@|]?[oax%Ng=-$&#34; x=&#34;13&#34; y=&#34;13&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;X0_fT4u][vKW0ofbv_t#&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;Gh-S_%L57-///qxB(lj8&#34; x=&#34;13&#34; y=&#34;88&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ms/6($YO*/BKvA:[N7LH&#34;&gt;Line1&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;Dv0k~b;T_7rnP;|G%EVG&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;Ravi de vous rencontrer&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;$49UN|U9Ub}Zf]b[6Yi3&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;C2.i$o:.CGmHAK~=6@Hp&#34;&gt;Line2&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;qt|*I5%J)i@t{!xC|xbt&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;comment va ?&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;YzX3U|{C23aeRJM^E_C,&#34; x=&#34;13&#34; y=&#34;188&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;HOaXZA:Qn4+rp4WvXUls&#34;&gt;Delay&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;xdp.@4`[[}(ZO9$c9%6B&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.15&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;/]kC}7Pb9Z::neg?dXI}&#34; x=&#34;13&#34; y=&#34;263&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;panel_width&#34; id=&#34;a,Jum$u0J(!XI/4_Ob@/&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;u*LEMHRk}?ti78X[JEtB&#34; x=&#34;13&#34; y=&#34;313&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ibYSTe:27[-s?IZ$/[P1&#34;&gt;Blank&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;iBAWfiB(?A@d51,sKQhU&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;controls_repeat_ext&#34; id=&#34;u[*JRni[/_sOV-]:HI([&#34; x=&#34;13&#34; y=&#34;363&#34;&gt; &lt;value name=&#34;TIMES&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;IpHVs/pk=he^[{o:vObe&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;10&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;]hkIFLnOb8|o3ktuN0N3&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;text_append&#34; id=&#34;#`aDRTgq!]Ol*e48,lM1&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ibYSTe:27[-s?IZ$/[P1&#34;&gt;Blank&lt;/field&gt; &lt;value name=&#34;TEXT&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;vXeUTK_*_Us7Y_.CBi]T&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt; &lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;block type=&#34;panel_backlight_on&#34; id=&#34;E@lgwW)Qd=r!21M4v_Rh&#34; x=&#34;13&#34; y=&#34;488&#34;&gt;&lt;/block&gt; &lt;block type=&#34;controls_if&#34; id=&#34;NAsS?t1KPgBr(.Dzn~)-&#34; x=&#34;13&#34; y=&#34;563&#34;&gt; &lt;value name=&#34;IF0&#34;&gt; &lt;block type=&#34;text_isEmpty&#34; id=&#34;+f-`H-M#L3s:(*D]c(8w&#34;&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;xM6Wb;K3bhZhE#[Dv?6U&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;tilRHHPF?Qx+$7HN^sZ3&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;statement name=&#34;DO0&#34;&gt; &lt;block type=&#34;variables_set&#34; id=&#34;dLkbAlPdcd(U7(rtLru0&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text_prompt_ext&#34; id=&#34;MUenVO6d9B=/bo1^;}=y&#34;&gt; &lt;mutation type=&#34;TEXT&#34;&gt;&lt;/mutation&gt; &lt;field name=&#34;TYPE&#34;&gt;TEXT&lt;/field&gt; &lt;value name=&#34;TEXT&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;Y^@~+G9#rkcQo)o+q{/o&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;Nom ?&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/statement&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;5e/wM_c97{t_yE0VS):-&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text_trim&#34; id=&#34;bT%qj`Kf;6e!0(mMrdHx&#34;&gt; &lt;field name=&#34;MODE&#34;&gt;BOTH&lt;/field&gt; &lt;value name=&#34;TEXT&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;#gd]Z}|_Tl8eE}Ozgo$o&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;abc&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;^=LLUVH_ni!*^E1e}FkV&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;Ht~EBKw,Jio*!Ggnxv?=&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Y)Mc:KXD3,mxdyRX.xNV&#34;&gt;Message&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;text_join&#34; id=&#34;W^HeO{]g2]w^BHFRp@QD&#34;&gt; &lt;mutation items=&#34;6&#34;&gt;&lt;/mutation&gt; &lt;value name=&#34;ADD0&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;qQGqBezQ_1M(g*jvg3T7&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ibYSTe:27[-s?IZ$/[P1&#34;&gt;Blank&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ADD1&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;.*ykE~B!c$U-2I}~}2+]&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ms/6($YO*/BKvA:[N7LH&#34;&gt;Line1&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ADD2&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;KdajUCv=3!~_N0fkksik&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;, &lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ADD3&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;1pUd0ZtYd+ITd8:Niun;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ADD4&#34;&gt; &lt;block type=&#34;text&#34; id=&#34;y1bao)N13OzZ+u{.0+QG&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;,&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ADD5&#34;&gt; &lt;block type=&#34;text_getSubstring&#34; id=&#34;.}g-GxSo|mugLfa174N~&#34;&gt; &lt;mutation at1=&#34;true&#34; at2=&#34;true&#34;&gt;&lt;/mutation&gt; &lt;field name=&#34;WHERE1&#34;&gt;FROM_START&lt;/field&gt; &lt;field name=&#34;WHERE2&#34;&gt;FROM_START&lt;/field&gt; &lt;value name=&#34;STRING&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;f|KeLyDUfWsx=W[p!Ys?&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;ibYSTe:27[-s?IZ$/[P1&#34;&gt;Blank&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;AT1&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;h$Wpc8eB-l%S2AvN_ax!&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;AT2&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;w~(bC6@pbQ#8RO1R!Ng/&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MINUS&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;[^@ZddE~yq@!Yvf1YA?3&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;Q/=+Y=G[F3huZ=WoI4t~&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;e#LeXVVs.:Pc@AybCl4w&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;#G,nCOcP:6|{Kcz4hOwW&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;VrA-k+*rXIeMrC3[832K&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;text_length&#34; id=&#34;/@@OE_A}.RiSmOwS6W{~&#34;&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;/BW]kC8A03h;I(}D`-*k&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;abc&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;yrXC38Om)FPX(~!*RPU;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;qQ9%Yg*VhY6?7}iqprBV&#34;&gt;Name&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;?|w.Mdb,M};pb%[C,(ZY&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;panel_clear&#34; id=&#34;n!e_%_aGPo1@j?N[{1V,&#34;&gt; &lt;next&gt; &lt;block type=&#34;controls_for&#34; id=&#34;X2l-N9a.o@}cx5y]-kR|&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;8!0pa[Oc~za|8TKPF|{n&#34;&gt;j&lt;/field&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;XadbJp!{rg=e5*sb)N~}&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;}T4KwbBZ]uP;+r|C!A_E&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;10&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;au.`tIb^GjTTZ]A8o#+0&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MINUS&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;2^d{O]cR^gn8C1X!vPjB&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;text_length&#34; id=&#34;^]f%uGrP2IZOUmiHmPKX&#34;&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;shadow type=&#34;text&#34; id=&#34;dn3(EOo/vTI,u^$b,WPX&#34;&gt; &lt;field name=&#34;TEXT&#34;&gt;abc&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;HL@_aD!?iD3M;zbW}`vQ&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Y)Mc:KXD3,mxdyRX.xNV&#34;&gt;Message&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;NP|pcNt|km59?qqEK-_Q&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;16&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;r_*pjK!c|x^[`H4Ib^Vw&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;BY&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;RTJiDx1w8{jJtHc8@^i:&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;panel_moveTo&#34; id=&#34;#t9F(4f/pppI+m/_{Ztn&#34;&gt; &lt;value name=&#34;X&#34;&gt; &lt;shadow type=&#34;panel_moveTo_x&#34; id=&#34;jGBjg120{iR^H$.Ss6;G&#34;&gt; &lt;field name=&#34;X&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;Y&#34;&gt; &lt;shadow type=&#34;panel_moveTo_y&#34; id=&#34;w=VMa9j7{,[$(p[@}r$R&#34;&gt; &lt;field name=&#34;Y&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;panel_putString&#34; id=&#34;aN6?xK!/e|Sb1eD`@2`Y&#34;&gt; &lt;value name=&#34;STRING&#34;&gt; &lt;shadow type=&#34;panel_putString_string&#34; id=&#34;0#ViP9p$$AnO(u-I;YA8&#34;&gt; &lt;field name=&#34;STRING&#34;&gt;&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;text_getSubstring&#34; id=&#34;aW:}IW{51{/OmMT`CZGp&#34;&gt; &lt;mutation at1=&#34;true&#34; at2=&#34;true&#34;&gt;&lt;/mutation&gt; &lt;field name=&#34;WHERE1&#34;&gt;FROM_START&lt;/field&gt; &lt;field name=&#34;WHERE2&#34;&gt;FROM_START&lt;/field&gt; &lt;value name=&#34;STRING&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;xXjPm%)%vsXQag@bll%;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;Y)Mc:KXD3,mxdyRX.xNV&#34;&gt;Message&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;AT1&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;O4gRw_}L.kfw2NZnpsDH&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;/bf_ap0204!TRmep+LVS&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;P4q!L8qo!J|]jx*UcBy.&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;8!0pa[Oc~za|8TKPF|{n&#34;&gt;j&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Zp_rxq^mVBUu0ZP?([k=&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;AT2&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;KY{P:po/=LJdhJgpQ=4-&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;/bf_ap0204!TRmep+LVS&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;7~/URbe?;|y6$mVLXq-G&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;8!0pa[Oc~za|8TKPF|{n&#34;&gt;j&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;a2GyK=(W`1i^qAU9+*R[&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;16&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;|1SD|gLXvPCk)74{1brx&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;:(Nudlg@$.qhl*n`Oz@W&#34;&gt;Width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;SP`?4}@ygZez3b#%@Djm&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;keoza!{:s]%y99o6EF!q&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;=ueSpP(k$7B@F9X~`1_W&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;HOaXZA:Qn4+rp4WvXUls&#34;&gt;Delay&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;next&gt; &lt;block type=&#34;panel_moveTo&#34; id=&#34;g,(~$Nvq@u9)ge7B)}To&#34;&gt; &lt;value name=&#34;X&#34;&gt; &lt;shadow type=&#34;panel_moveTo_x&#34; id=&#34;Mmlg^eP-or]B_#xq10=Y&#34;&gt; &lt;field name=&#34;X&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;Y&#34;&gt; &lt;shadow type=&#34;panel_moveTo_y&#34; id=&#34;6$|%F4SfH/7-AZib`ZXU&#34;&gt; &lt;field name=&#34;Y&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;panel_putString&#34; id=&#34;i#Lhqh%V~ZD-c#,Wh/Z$&#34;&gt; &lt;value name=&#34;STRING&#34;&gt; &lt;shadow type=&#34;panel_putString_string&#34; id=&#34;0#ViP9p$$AnO(u-I;YA8&#34;&gt; &lt;field name=&#34;STRING&#34;&gt;&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;LnS5e-[pM$i:y_jN|M3E&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;C2.i$o:.CGmHAK~=6@Hp&#34;&gt;Line2&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/xml&gt;

OLED (écran OLED)#

&lt;xml xmlns=&#34;https://developers.google.com/blockly/xml&#34;&gt; &lt;variables&gt; &lt;variable id=&#34;m^cffBzw%yLTmsdu,yS)&#34;&gt;height&lt;/variable&gt; &lt;variable id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/variable&gt; &lt;variable id=&#34;E.%(T770_JW`d}K15SK7&#34;&gt;t&lt;/variable&gt; &lt;variable id=&#34;,r{*hL|.D.86i7i,.#W+&#34;&gt;halfHeight&lt;/variable&gt; &lt;variable id=&#34;jXod5e2lVwPQ$C%1Vz+4&#34;&gt;halfWidth&lt;/variable&gt; &lt;variable id=&#34;(YDw6Y*0RInMAX%eSgQW&#34;&gt;i&lt;/variable&gt; &lt;variable id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/variable&gt; &lt;variable id=&#34;-5[DX_esbuFVCJqSmj.N&#34;&gt;a&lt;/variable&gt; &lt;variable id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/variable&gt; &lt;variable id=&#34;~!k;5tc=-/NW*w|R~7Y{&#34;&gt;r&lt;/variable&gt; &lt;/variables&gt; &lt;block type=&#34;variables_set&#34; id=&#34;NB+$}Cn(A.ZL2d]Y,pNk&#34; x=&#34;13&#34; y=&#34;13&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;m^cffBzw%yLTmsdu,yS)&#34;&gt;height&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;screen_height&#34; id=&#34;0t3ko{JSn%Z-#2v|F_2S&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;iG/sG**im$:~O3OU?$B3&#34; x=&#34;13&#34; y=&#34;63&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;screen_width&#34; id=&#34;USy-jg#s@PALN`#bP6ND&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;p)z651v~^IX.dkU^;9dl&#34; x=&#34;13&#34; y=&#34;113&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;E.%(T770_JW`d}K15SK7&#34;&gt;t&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;M+tJ[H1tfpZfGUFwO,4Y&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;block type=&#34;variables_set&#34; id=&#34;2?(F/E5PEdK!IPQHMx:J&#34; x=&#34;13&#34; y=&#34;163&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;,r{*hL|.D.86i7i,.#W+&#34;&gt;halfHeight&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;OdRluE1t_O$SN[H)NNg|&#34;&gt; &lt;field name=&#34;OP&#34;&gt;DIVIDE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;h5xqG+KmC5,eS9=8}0-B&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;@xCmq@W%s@prIg%LY*q*&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;m^cffBzw%yLTmsdu,yS)&#34;&gt;height&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;2()wh@T8=(;F}.51Q~hk&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;2&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;+@Wa/}b|Y%9=d.q/hcOQ&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;jXod5e2lVwPQ$C%1Vz+4&#34;&gt;halfWidth&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;.cFJ9HhbpK=_tx9nfHWt&#34;&gt; &lt;field name=&#34;OP&#34;&gt;DIVIDE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;h5xqG+KmC5,eS9=8}0-B&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;zSw{$KSdWM[WTZ+?G!Fr&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;jbo.]z3K`D:Oa5?8d?w/&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;2&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;block type=&#34;controls_repeat_ext&#34; id=&#34;cCZtUXPs};R_n#LP0NuO&#34; inline=&#34;true&#34; x=&#34;13&#34; y=&#34;263&#34;&gt; &lt;value name=&#34;TIMES&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;ZXg|4@^LAJo^^juv^Qz{&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;75&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;screen_fill&#34; id=&#34;AgV.QwdaF3+e=@1DFGi(&#34;&gt; &lt;value name=&#34;COLOR&#34;&gt; &lt;shadow type=&#34;screen_fill_color&#34; id=&#34;Wx2gbUC[rb/~|AzK(YX6&#34;&gt; &lt;field name=&#34;COLOR&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;screen_black&#34; id=&#34;@1delQyXm(F)lRNn[xb^&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;controls_for&#34; id=&#34;w6pkK|LJsEm#M8`QknhG&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;(YDw6Y*0RInMAX%eSgQW&#34;&gt;i&lt;/field&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Zkc!}.;pOI?[e`sYnA]d&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;,oMph)YLPc-PEnD^-OtS&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;199&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;BY&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Arc@P6apY.mIuD@i5CTA&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;variables_set&#34; id=&#34;g?Z/GOev6ae/?*=C~QXS&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;-5[DX_esbuFVCJqSmj.N&#34;&gt;a&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;?s!1JlQV=u%CIPlBOF^h&#34;&gt; &lt;field name=&#34;OP&#34;&gt;DIVIDE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;*kuT7W^;Z3QcwsIwq5}[&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;2R}F6aPrHA3yKa)WUmwP&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;=jK3lcRag0?wXY#8)6u~&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;E[oE*HY9MudF0Fxg:y%3&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;fjGG[wIH-Oq)j3Odhcx5&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;~%Lgr/Dd.%kBq/WFNrWB&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;j!ErMe%mpuP644;aJMtL&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;uf8db3W.nrR@Vnkuim0G&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;(YDw6Y*0RInMAX%eSgQW&#34;&gt;i&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;7YR9}YxGTS3CST`H5!^w&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;OQ/BB11t`H6zpCu^X:Yu&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;N41I^v$?ARx8;{|VXVBL&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;E.%(T770_JW`d}K15SK7&#34;&gt;t&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;c@f[iDnR};/l!GYM(V?O&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;180&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;2n~M0RT3bR}Y1LBvEh?6&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_constant&#34; id=&#34;Xka.Cl8U$D+w0lZ1cpTM&#34;&gt; &lt;field name=&#34;CONSTANT&#34;&gt;PI&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;`Ur25~!vfUAMGH]yGBC+&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;~!k;5tc=-/NW*w|R~7Y{&#34;&gt;r&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;%/!1E^?Ca1B:=HU6t3#)&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;RV4,Z_Guk8Sc$cOhnih=&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;8FJ}u|Fn_bQnD~.iH+Q-&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;r?+n^1R;H1q-@?#u/g!R&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;(YDw6Y*0RInMAX%eSgQW&#34;&gt;i&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;*-WBQ!pP4V?Y[n:_B2Cm&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_round&#34; id=&#34;=zco:)v(%i6YzDkKBl,(&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ROUND&lt;/field&gt; &lt;value name=&#34;NUM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;]Ax~hZ6r]wNrRi]#etS.&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;3.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;+2Y`nW8DT#B,Ae~j.bC0&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;[X$F=AQ}Eyfvyyu+5*lM&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;G6IXk,lu}!=N98NZ,kNS&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;jXod5e2lVwPQ$C%1Vz+4&#34;&gt;halfWidth&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;*XwqfhvQ(zCtJr[@DO,,&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;_D-hkP{dqnrh+uX`CQ8T&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;LFijpR3+9=(`2*$=j)U.&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_trig&#34; id=&#34;@t?2X~(yqi8C!n=hv+tC&#34;&gt; &lt;field name=&#34;OP&#34;&gt;COS&lt;/field&gt; &lt;value name=&#34;NUM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;3k+E*Qipkp);GS-O,~Uw&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;45&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;wY[K0_[^INHqvpAL*;^g&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;-5[DX_esbuFVCJqSmj.N&#34;&gt;a&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;mSR`[-hi6d4Y-hM5$)*2&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;[W8|Fo%g;1%jnu-ZxVr|&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;~!k;5tc=-/NW*w|R~7Y{&#34;&gt;r&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;qOaLs~leVlq6QB4{23ec&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_round&#34; id=&#34;aC/0Pq6xYe{n6.oH46D5&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ROUND&lt;/field&gt; &lt;value name=&#34;NUM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;]Ax~hZ6r]wNrRi]#etS.&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;3.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;ci#Nl,+IOx]sGb)sp^p-&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ADD&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;[X$F=AQ}Eyfvyyu+5*lM&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;/E@Sdlb^:5Mm2Qh0sh_7&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;,r{*hL|.D.86i7i,.#W+&#34;&gt;halfHeight&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;*XwqfhvQ(zCtJr[@DO,,&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;N*o)Tr)PVkc5OvUwH2cE&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;LFijpR3+9=(`2*$=j)U.&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_trig&#34; id=&#34;d=SFxfH.wE#vE/~ywN_D&#34;&gt; &lt;field name=&#34;OP&#34;&gt;SIN&lt;/field&gt; &lt;value name=&#34;NUM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;~BY2X{[W{c;]m8:.!BeD&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;45&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;EBn=x#J^|Gj(E}2mIs9;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;-5[DX_esbuFVCJqSmj.N&#34;&gt;a&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;mSR`[-hi6d4Y-hM5$)*2&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;NIVD`R-/2(7qa]1fj{/g&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;~!k;5tc=-/NW*w|R~7Y{&#34;&gt;r&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;controls_if&#34; id=&#34;BgF$QhI?S=`J{;{WGA{D&#34;&gt; &lt;value name=&#34;IF0&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;V1BgTaFQCA/G}LC8YFuM&#34; inline=&#34;false&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;`{=qJldE++V8^Lg1Hr?}&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;%K_-Q7+ybD0_[I2$=rbL&#34;&gt; &lt;field name=&#34;OP&#34;&gt;LTE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;Nvq_yEogJCQ.J}ep0A,?&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;NE(W0JetI/UH)CS@Njq|&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;kL@JKN!*pB;Ql*-z[q{.&#34;&gt; &lt;field name=&#34;OP&#34;&gt;LT&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;]HUGW=1y;]Q#c!e+7=M]&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;%hrjo#Nv:5}p=Yt{Houz&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_operation&#34; id=&#34;iBu7$[!$=M%joi2VE+U*&#34;&gt; &lt;field name=&#34;OP&#34;&gt;AND&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;V~NkM$mn);e=PwrjMtKJ&#34;&gt; &lt;field name=&#34;OP&#34;&gt;LTE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;_wi5we/BTuAQ};NygVSS&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;a`@2v*KN^k=jU5Y~cIM:&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;|E/@@Pn4ya@kJ`D:3N1P&#34;&gt; &lt;field name=&#34;OP&#34;&gt;LT&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;gAj/6$L+5/vD[J4og.0+&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;9{qhHyx_hxI,QhnS9S(/&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;m^cffBzw%yLTmsdu,yS)&#34;&gt;height&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;statement name=&#34;DO0&#34;&gt; &lt;block type=&#34;screen_pixel&#34; id=&#34;~szbfqaj@S/q0)4d5ua0&#34;&gt; &lt;value name=&#34;X&#34;&gt; &lt;shadow type=&#34;screen_pixel_x&#34; id=&#34;bAf?D*(jCj?!ldKdSrv7&#34;&gt; &lt;field name=&#34;X&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;c}_J.ou#Jxin)0|]vlf_&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;Y&#34;&gt; &lt;shadow type=&#34;screen_pixel_y&#34; id=&#34;-s.U[n`]{*}oLkdfqZby&#34;&gt; &lt;field name=&#34;Y&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;zM|noh,y9p,(Jv=oFuZ,&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;COLOR&#34;&gt; &lt;shadow type=&#34;screen_pixel_color&#34; id=&#34;[uY9=i%0jg(56]=1Ajvh&#34;&gt; &lt;field name=&#34;COLOR&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;screen_white&#34; id=&#34;aG5EDU_{4$EVl3;|hsBp&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;next&gt; &lt;block type=&#34;screen_show&#34; id=&#34;EVEj8Z[f--hPmU-y59%p&#34;&gt; &lt;next&gt; &lt;block type=&#34;math_change&#34; id=&#34;)/6C]6DO/#BrzrNQ14g~&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;E.%(T770_JW`d}K15SK7&#34;&gt;t&lt;/field&gt; &lt;value name=&#34;DELTA&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;gwI?u8g]En.l)pN+jSS!&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0.1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;block type=&#34;controls_repeat_ext&#34; id=&#34;nY9r(XH%m_7I8`/EJ[Bs&#34; x=&#34;13&#34; y=&#34;938&#34;&gt; &lt;value name=&#34;TIMES&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;zm64RL$U:5,0`i8[:Rpd&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;50&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;screen_fill&#34; id=&#34;VICAJmOlhZj1g4fzNOn6&#34;&gt; &lt;value name=&#34;COLOR&#34;&gt; &lt;shadow type=&#34;screen_fill_color&#34; id=&#34;Wx2gbUC[rb/~|AzK(YX6&#34;&gt; &lt;field name=&#34;COLOR&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;screen_black&#34; id=&#34;K=VA|Cak]7~C~4-7)USA&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;[yEIXx,9BV4S(FSHmbBo&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;;T|kl%9B).wPfNLf)moM&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Ja(b-keNDb$(J;$(#}Yw&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_random_float&#34; id=&#34;;LV{/8MZA6YYmFJF/}cH&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Qa45tdDV[[x!R.2O-XUA&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;2zc,F/K4qKAM9:)%A+I5&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;controls_for&#34; id=&#34;Y0{wGRQ;wcZ]Z?,uIHB#&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;value name=&#34;FROM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;p_6,,0!$76Ho1b0ntywb&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;value name=&#34;TO&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;/r1x1;;PDeL_hSA@-oh:&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;10&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;ilIT)FRd1]c|;zjxK:n@&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MINUS&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;`)}8`jM5*BM`4E=q:Al.&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;8LohRZ#AH}tL?-s,:,rB&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;m^cffBzw%yLTmsdu,yS)&#34;&gt;height&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;lyE5gtG?BH,+M}?(Z%@9&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;BY&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;oqA6aCYzH$XU*wP^ms40&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;statement name=&#34;DO&#34;&gt; &lt;block type=&#34;screen_pixel&#34; id=&#34;,XBHX?3@eDk)jz_L~00?&#34;&gt; &lt;value name=&#34;X&#34;&gt; &lt;shadow type=&#34;screen_pixel_x&#34; id=&#34;bAf?D*(jCj?!ldKdSrv7&#34;&gt; &lt;field name=&#34;X&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;MF~Z?MN3uSr?,g]tWmL;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;Y&#34;&gt; &lt;shadow type=&#34;screen_pixel_y&#34; id=&#34;-s.U[n`]{*}oLkdfqZby&#34;&gt; &lt;field name=&#34;Y&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;8d1Kdqv[Lo]cIwsBfgss&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;I#xrrdQ,[-=.r?7}4%It&#34;&gt;y&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;COLOR&#34;&gt; &lt;shadow type=&#34;screen_pixel_color&#34; id=&#34;[uY9=i%0jg(56]=1Ajvh&#34;&gt; &lt;field name=&#34;COLOR&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;screen_white&#34; id=&#34;vt0OvlYiPEbRs0b/A+1z&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;math_change&#34; id=&#34;p.x9S@m1neS4)H2,8R)t&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;value name=&#34;DELTA&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;kBvy(Ca]U]hhS9cfAd)3&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_round&#34; id=&#34;Lxhd9?z#;d1Szw!7U8ly&#34;&gt; &lt;field name=&#34;OP&#34;&gt;ROUND&lt;/field&gt; &lt;value name=&#34;NUM&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;r^TwNNyI^@aHf)$+u7OK&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;3.1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;U}1)kvTzc%o5*KHi.IP@&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MINUS&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;XB|;zT)XGJc^]u_pGGm#&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;(RFi(L8C=pR`0Yms-+cn&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MULTIPLY&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Ja(b-keNDb$(J;$(#}Yw&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;math_random_float&#34; id=&#34;3=gXEGpHK}PMcSmG+9Q)&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;Qa45tdDV[[x!R.2O-XUA&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;3&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;H|ON5Lk`^4Yln7[oG+Xy&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;variables_set&#34; id=&#34;`n:4zf~]JxuaWkv(oO|^&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;logic_ternary&#34; id=&#34;cBU4@Wy3Q_}0wDCLE6cL&#34; inline=&#34;true&#34;&gt; &lt;value name=&#34;IF&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;=aLrKI9z!4c$+v$`lEh?&#34;&gt; &lt;field name=&#34;OP&#34;&gt;LT&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;0ZIBR}l=J{Tf=KPBdJ9]&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;:FB`2!H?IP%w{(*;HeDq&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;THEN&#34;&gt; &lt;block type=&#34;math_number&#34; id=&#34;c?c_wxT8$3?MNgh=$!E?&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;0&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;ELSE&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;W|srCVw~yWe%D@,ioe}b&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;controls_if&#34; id=&#34;,O?]r!oFdY(CkGlq}D|r&#34;&gt; &lt;value name=&#34;IF0&#34;&gt; &lt;block type=&#34;logic_compare&#34; id=&#34;*JL*tO%DfF@$}(rz!6vo&#34;&gt; &lt;field name=&#34;OP&#34;&gt;GTE&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;`WN4S=}yCNIvoV9JeQwv&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;block type=&#34;variables_get&#34; id=&#34;bUx|=2/{B=4hXfQGk0q2&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;statement name=&#34;DO0&#34;&gt; &lt;block type=&#34;variables_set&#34; id=&#34;coq8Sl1Ji!1u2y.wJJ5;&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;|qmo$}J2T%j}aoj@crsq&#34;&gt;x&lt;/field&gt; &lt;value name=&#34;VALUE&#34;&gt; &lt;block type=&#34;math_arithmetic&#34; id=&#34;,pn:PWh[t;xxgS1Hww$b&#34;&gt; &lt;field name=&#34;OP&#34;&gt;MINUS&lt;/field&gt; &lt;value name=&#34;A&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;0_4+Ancr5YLfUd;)xl~)&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;variables_get&#34; id=&#34;g+Mb!9Fq5Fz9IQ6[~+!b&#34;&gt; &lt;field name=&#34;VAR&#34; id=&#34;a?Bs?S}S1E6w6/bTvUM)&#34;&gt;width&lt;/field&gt; &lt;/block&gt; &lt;/value&gt; &lt;value name=&#34;B&#34;&gt; &lt;shadow type=&#34;math_number&#34; id=&#34;~pgQTXl=p|)Qpl7Mn}a=&#34;&gt; &lt;field name=&#34;NUM&#34;&gt;1&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/value&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;next&gt; &lt;block type=&#34;screen_show&#34; id=&#34;^%e{-?-`o#33+)}c6M-]&#34;&gt; &lt;next&gt; &lt;block type=&#34;ucuq_sleep&#34; id=&#34;b:76/m.D)tn7MsHX`mV,&#34;&gt; &lt;value name=&#34;SECONDS&#34;&gt; &lt;shadow type=&#34;ucuq_sleep_seconds&#34; id=&#34;YROlUz-Lzw}-:[Aw*^6y&#34;&gt; &lt;field name=&#34;SECONDS&#34;&gt;0.05&lt;/field&gt; &lt;/shadow&gt; &lt;/value&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/statement&gt; &lt;/block&gt; &lt;block type=&#34;screen_fill&#34; id=&#34;-*U+QET|zqJX!]C?f_;U&#34; x=&#34;13&#34; y=&#34;1538&#34;&gt; &lt;value name=&#34;COLOR&#34;&gt; &lt;shadow type=&#34;screen_fill_color&#34; id=&#34;Wx2gbUC[rb/~|AzK(YX6&#34;&gt; &lt;field name=&#34;COLOR&#34;&gt;0&lt;/field&gt; &lt;/shadow&gt; &lt;block type=&#34;screen_black&#34; id=&#34;o{R}f|Kow^j$nLp2(-OW&#34;&gt;&lt;/block&gt; &lt;/value&gt; &lt;next&gt; &lt;block type=&#34;screen_show&#34; id=&#34;6toM~7X%]$)8{1OZJ.2I&#34;&gt;&lt;/block&gt; &lt;/next&gt; &lt;/block&gt; &lt;/xml&gt;

Dépannage