Strudel REPLhttps://strudel.cc/?uxBZTiojsEW8#Ly8gIkxpdmUgYXVkaW8gaW4gbG9vcGVyIiBAYnkgaWxlc2luZ2UKCi8vIFVzYWdlOgovLyBSZWNvcmQgZWFjaCBjeWNsZSBmcm9tIHRoZSBkZWZhdWx0IGF1ZGlvIGludGVyZmFjZQovLyBzKCJsb29wZXIiKQovLyBPdXRwdXQgdGhlIGxhc3QgcmVjb3JkZWQgY3ljbGUKLy8gcygibG9vcCIpCi8vIEdpdmUgdGhlIGxvb3AgYW5vdGhlciBzYW1wbGUgbmFtZQovLyBzKCJsb29wZXIgfiBjaGVlc2UiKS5sb29wTmFtZSgiY2hlZXNlIikKLy8gR2l2ZSB0aGUgbG9vcCBhIHNwZWNpZmljIHNhbXBsZSBudW1iZXIKLy8gcygibG9vcGVyOjAgbG9vcGVyOjEiKQoKLy8gSXQgY291bGQgYmUgdXNlZCB0byBzYW1wbGUgb3RoZXIgc29mdHdhcmUncyBvdXRwdXQKLy8gYnkgcGx1Z2dpbmcgaW4gYSB2aXJ0dWFsIGF1ZGlvIGludGVyZmFjZSAoc2VlIFRPRE8gYmVsb3cpCgovLyBOb3RlOiBhIHJlc3QgaXMgbmVlZGVkIGJldHdlZW4gdGhlIGxvb3BlciBhbmQgdGhlIGxvb3AKLy8gb3RoZXJ3aXNlIHRoZSBzYW1wbGUgaXMgbm90IHlldCByZWNvcmRlZCBvciBvdmVyd3JpdHRlbgovLyBzbyBpdCB0YWtlcyB0aGUgcHJldmlvdXMgY3ljbGUncyByZWNvcmRpbmcKCmF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSkKICAudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7CiAgICB3aW5kb3cuc3RyZWFtID0gc3RyZWFtOwogIH0pCiAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgewogICAgY29uc29sZS5sb2coZXJyb3IpOwogIH0pOwoKbGV0IGxvb3BlcnMgPSB7fTsKCmNyZWF0ZVBhcmFtKCdsb29wTmFtZScpOwpQYXR0ZXJuLnByb3RvdHlwZVsnbG5hbWUnXSA9IFBhdHRlcm4ucHJvdG90eXBlWydsb29wTmFtZSddOwoKcmVnaXN0ZXJTb3VuZCgKICAnbG9vcGVyJywKICAodGltZSwgdmFsdWUsIG9uZW5kZWQpID0%2BIHsKICAgIGNvbnN0IGN0eCA9IGdldEF1ZGlvQ29udGV4dCgpOwogICAgbGV0IG4gPSB2YWx1ZS5uIHx8IDA7CiAgICBsZXQgbG9vcE5hbWUgPSB2YWx1ZS5sb29wTmFtZSB8fCAnbG9vcCc7CiAgICAKICAgIGxldCBjaHVua3MgPSBbXTsKCiAgICBsb29wZXJzW2xvb3BOYW1lXSA9IGxvb3BlcnNbbG9vcE5hbWVdIHx8IFtdOwoKICAgIC8qIE1lZGlhUmVjb3JkZXIgbWF5IGJlIHBhc3NlZCBhIHNlY29uZCAnb3B0aW9uJyBwYXJhbWV0ZXJzLCBzdWNoIGFzOgogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgYXVkaW9CaXRzUGVyU2Vjb25kOiAxMjgwMDAsCiAgICAgIGF1ZGlvQml0cmF0ZU1vZGU6ICdjb25zdGFudCcsCiAgICAgIG1pbWVUeXBlOiAiYXVkaW8vd2F2IiwKICAgIH07Ki8KICAgIGxldCByZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHdpbmRvdy5zdHJlYW0pOwogICAgcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgY2h1bmtzLnB1c2goZS5kYXRhKTsKICAgIH07CiAgICByZWNvcmRlci5vbnN0b3AgPSBmdW5jdGlvbiAoZSkgewogICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoY2h1bmtzKTsKICAgICAgY2h1bmtzID0gW107CiAgICAgIGNvbnN0IGF1ZGlvVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgIGxvb3BlcnNbbG9vcE5hbWVdW25dID0gYXVkaW9VUkw7CiAgICAgIC8vIGFjY2Vzc2luZyBpbnRlcm1lZGlhdGUgc2FtcGxlcyAodW5kZWZpbmVkKSB3aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGVycm9yOgogICAgICAvLyBbY3ljbGlzdF0gZXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkIChyZWFkaW5nICdyZXBsYWNlJykKICAgICAgcmVnaXN0ZXJTb3VuZChsb29wTmFtZSwgKHQsIGhhcFZhbHVlLCBvbmVuZGVkKSA9PiBvblRyaWdnZXJTYW1wbGUodCwgaGFwVmFsdWUsIG9uZW5kZWQsIGxvb3BlcnNbbG9vcE5hbWVdKSwgewogICAgICAgIHR5cGU6ICdzYW1wbGUnLAogICAgICAgIHNhbXBsZXM6IGxvb3BlcnNbbG9vcE5hbWVdLAogICAgICB9KQogICAgfQoKICAgIHNldFRpbWVvdXQoCiAgICAgICgpID0%2BIHsKICAgICAgICByZWNvcmRlci5zdGFydCgpOwogICAgICB9LAogICAgICBNYXRoLm1heCgwLCAodGltZSAtIGN0eC5jdXJyZW50VGltZSkgKiAxMDAwKSwKICAgICk7CgogICAgY29uc3Qgc3RvcCA9IGZ1bmN0aW9uIChlbmR0aW1lKSB7CiAgICAgIHNldFRpbWVvdXQoCiAgICAgICAgKCkgPT4gewogICAgICAgICAgcmVjb3JkZXIuc3RvcCgpOwogICAgICAgIH0sCiAgICAgICAgTWF0aC5tYXgoMCwgKGVuZHRpbWUgLSBjdHguY3VycmVudFRpbWUpICogMTAwMCksCiAgICAgICk7CiAgICB9OwogICAgcmV0dXJuIHsgdW5kZWZpbmVkLCBzdG9wIH07CiAgfQopOwoKc3RhY2soCiAgcygibG9vcGVyIiksCiAgcygibG9vcCozIH4iKS5yb29tKDAuMyksCikKCi8vIFRvZG86Ci8vIC0gQWxsb3cgdG8gY2hvb3NlIGlucHV0IGF1ZGlvIGludGVyZmFjZQovLyAtIHN0cmVhbXMgc2hvdWxkIGJlIHN0YXJ0ZWQgYnkgbG9vcGVyCi8vIC0gc3RvcmUgYSBzdHJlYW0gcGVyIGNob3NlbiBkZXZpY2VpZAovKgpuYXZpZ2F0b3IubWVkaWFEZXZpY2VzCiAgICAuZW51bWVyYXRlRGV2aWNlcygpCiAgICAudGhlbigoZGV2aWNlcykgPT4gewogICAgICBkZXZpY2VzLmZvckVhY2goKGRldmljZSkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKGAke2RldmljZS5raW5kfTogJHtkZXZpY2UubGFiZWx9IGlkID0gJHtkZXZpY2UuZGV2aWNlSWR9YCk7CiAgICAgIH0pOwogICAgfSk7CmxldCBhdWRpb0NvbnN0cmFpbnQgPSBkZXZpY2VJZCA%2FIHtkZXZpY2VJZDoge2V4YWN0OiBkZXZpY2VJZH19IDogdHJ1ZTsKYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe3ZpZGVvOiBmYWxzZSwgYXVkaW86IGF1ZGlvQ29uc3RyYWludH0pCiov voice livecoding voice livecoding