Created
August 19, 2021 16:04
-
-
Save erikfrey/eb8b138dce06f7c2135e9d9690a09a8e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"accelerator": "TPU", | |
"colab": { | |
"name": "locally dev js in brax.ipynb", | |
"provenance": [], | |
"collapsed_sections": [] | |
}, | |
"kernelspec": { | |
"display_name": "Python 3", | |
"name": "python3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "ssCOanHc8JH_" | |
}, | |
"source": [ | |
"# Locally dev js in brax" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "LgUFSJz2We_q", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "89af54d8-f036-4f60-ee13-963a8928ba60" | |
}, | |
"source": [ | |
"#@title Clone brax and make a local change\n", | |
"\n", | |
"!rm -rf /content/brax_local\n", | |
"!git clone https://github.com/google/brax.git brax_local\n", | |
"# add a console.log to prove we are running local js\n", | |
"!sed -i '46 i console.log(\"local change\");' /content/brax_local/js/viewer.js" | |
], | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Cloning into 'brax_local'...\n", | |
"remote: Enumerating objects: 473, done.\u001b[K\n", | |
"remote: Counting objects: 100% (182/182), done.\u001b[K\n", | |
"remote: Compressing objects: 100% (91/91), done.\u001b[K\n", | |
"remote: Total 473 (delta 126), reused 105 (delta 88), pack-reused 291\u001b[K\n", | |
"Receiving objects: 100% (473/473), 52.76 MiB | 14.59 MiB/s, done.\n", | |
"Resolving deltas: 100% (252/252), done.\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "_sOmCoOrF0F8" | |
}, | |
"source": [ | |
"#@title Colab setup and imports\n", | |
"\n", | |
"from IPython.display import HTML, clear_output\n", | |
"import jax\n", | |
"\n", | |
"try:\n", | |
" import brax\n", | |
"except ImportError:\n", | |
" !pip install git+https://github.com/google/brax.git@main\n", | |
" clear_output()\n", | |
" import brax\n", | |
"\n", | |
"from brax.io import html\n", | |
"from brax import envs" | |
], | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "xkb69H3kWWLl" | |
}, | |
"source": [ | |
"# serve /content/brax_local on http\n", | |
"\n", | |
"import threading\n", | |
"import socket\n", | |
"import http.server\n", | |
"import socketserver\n", | |
"\n", | |
"class V6Server(socketserver.TCPServer):\n", | |
" address_family = socket.AF_INET6\n", | |
"\n", | |
"class Handler(http.server.SimpleHTTPRequestHandler):\n", | |
" def __init__(self, *args, **kwargs):\n", | |
" super().__init__(*args, directory='/content/brax_local', **kwargs)\n", | |
"\n", | |
"port = 32888\n", | |
"\n", | |
"def server_entry():\n", | |
" httpd = V6Server(('::', port), Handler)\n", | |
" httpd.serve_forever()\n", | |
"\n", | |
"thread = threading.Thread(target=server_entry)\n", | |
"thread.start()" | |
], | |
"execution_count": 3, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"resources": { | |
"http://localhost:32888/js/viewer.js": { | |
"data": "LyoqCiAqIEBmaWxlb3ZlcnZpZXcgQnJheFZpZXdlciBjYW4gcmVuZGVyIHN0YXRpYyB0cmFqZWN0b3JpZXMgZnJvbSBqc29uIGFuZCBhbHNvCiAqIGNvbm5lY3QgdG8gYSByZW1vdGUgYnJheCBlbmdpbmUgZm9yIGludGVyYWN0aXZlIHZpc3VhbGl6YXRpb24uCiAqLwoKaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAnaHR0cHM6Ly90aHJlZWpzLm9yZy9idWlsZC90aHJlZS5tb2R1bGUuanMnOwppbXBvcnQge09yYml0Q29udHJvbHN9IGZyb20gJ2h0dHBzOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvanNtL2NvbnRyb2xzL09yYml0Q29udHJvbHMuanMnOwppbXBvcnQge0dVSX0gZnJvbSAnaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy9qc20vbGlicy9kYXQuZ3VpLm1vZHVsZS5qcyc7CgppbXBvcnQge0FuaW1hdG9yfSBmcm9tICcuL2FuaW1hdG9yLmpzJzsKaW1wb3J0IHtTZWxlY3Rvcn0gZnJvbSAnLi9zZWxlY3Rvci5qcyc7CmltcG9ydCB7Y3JlYXRlVHJhamVjdG9yeSwgY3JlYXRlU2NlbmV9IGZyb20gJy4vc3lzdGVtLmpzJzsKCmZ1bmN0aW9uIGRvd25sb2FkRGF0YVVyaShuYW1lLCB1cmkpIHsKICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICBsaW5rLmRvd25sb2FkID0gbmFtZTsKICBsaW5rLmhyZWYgPSB1cmk7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsKICBsaW5rLmNsaWNrKCk7CiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTsKfQoKZnVuY3Rpb24gZG93bmxvYWRGaWxlKG5hbWUsIGNvbnRlbnRzLCBtaW1lKSB7CiAgbWltZSA9IG1pbWUgfHwgJ3RleHQvcGxhaW4nOwogIGxldCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRzXSwge3R5cGU6IG1pbWV9KTsKICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspOwogIGxpbmsuZG93bmxvYWQgPSBuYW1lOwogIGxpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogIGxpbmsub25jbGljayA9IGZ1bmN0aW9uKGUpIHsKICAgIGxldCBzY29wZSA9IHRoaXM7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChzY29wZS5ocmVmKTsKICAgIH0sIDE1MDApOwogIH07CiAgbGluay5jbGljaygpOwogIGxpbmsucmVtb3ZlKCk7Cn0KCmNvbnN0IGhvdmVyTWF0ZXJpYWwgPQogICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogMHgzMzI3MjIsIGVtaXNzaXZlOiAweDExNGE2N30pOwpjb25zdCBzZWxlY3RNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7Y29sb3I6IDB4MjE5NGNlfSk7CgpjbGFzcyBWaWV3ZXIgewogIGNvbnN0cnVjdG9yKGRvbUVsZW1lbnQsIHN5c3RlbSkgewpjb25zb2xlLmxvZygibG9jYWwgY2hhbmdlIik7CiAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50OwogICAgdGhpcy5zeXN0ZW0gPSBzeXN0ZW07CiAgICB0aGlzLnNjZW5lID0gY3JlYXRlU2NlbmUoc3lzdGVtKTsKICAgIHRoaXMudHJhamVjdG9yeSA9IGNyZWF0ZVRyYWplY3Rvcnkoc3lzdGVtKTsKCiAgICAvKiBzZXQgdXAgcmVuZGVyZXIsIGNhbWVyYSwgYW5kIGFkZCBkZWZhdWx0IHNjZW5lIGVsZW1lbnRzICovCiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWV9KTsKICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7CiAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkID0gdHJ1ZTsKICAgIHRoaXMucmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBUSFJFRS5zUkdCRW5jb2Rpbmc7CgogICAgdGhpcy5kb21FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7CgogICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNDAsIDEsIDAuMDEsIDEwMCk7CiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoNSwgMiwgOCk7CiAgICB0aGlzLmNhbWVyYS5mb2xsb3cgPSB0cnVlOwogICAgdGhpcy5jYW1lcmEuZm9sbG93RGlzdGFuY2UgPSAxMDsKCiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHhhMGEwYTApOwogICAgdGhpcy5zY2VuZS5mb2cgPSBuZXcgVEhSRUUuRm9nKDB4YTBhMGEwLCA0MCwgNjApOwoKICAgIGNvbnN0IGhlbWlMaWdodCA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhmZmZmZmYsIDB4NDQ0NDQ0KTsKICAgIGhlbWlMaWdodC5wb3NpdGlvbi5zZXQoMCwgMjAsIDApOwogICAgdGhpcy5zY2VuZS5hZGQoaGVtaUxpZ2h0KTsKCiAgICBjb25zdCBkaXJMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmKTsKICAgIGRpckxpZ2h0LnBvc2l0aW9uLnNldCgzLCAxMCwgMTApOwogICAgZGlyTGlnaHQuY2FzdFNoYWRvdyA9IHRydWU7CiAgICBkaXJMaWdodC5zaGFkb3cuY2FtZXJhLnRvcCA9IDEwOwogICAgZGlyTGlnaHQuc2hhZG93LmNhbWVyYS5ib3R0b20gPSAtMTA7CiAgICBkaXJMaWdodC5zaGFkb3cuY2FtZXJhLmxlZnQgPSAtMTA7CiAgICBkaXJMaWdodC5zaGFkb3cuY2FtZXJhLnJpZ2h0ID0gMTA7CiAgICBkaXJMaWdodC5zaGFkb3cuY2FtZXJhLm5lYXIgPSAwLjE7CiAgICBkaXJMaWdodC5zaGFkb3cuY2FtZXJhLmZhciA9IDQwOwogICAgdGhpcy5zY2VuZS5hZGQoZGlyTGlnaHQpOwoKICAgIC8qIHNldCB1cCBvcmJpdCBjb250cm9scyAqLwogICAgdGhpcy5jb250cm9scyA9IG5ldyBPcmJpdENvbnRyb2xzKHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQpOwogICAgdGhpcy5jb250cm9scy5lbmFibGVQYW4gPSBmYWxzZTsKICAgIHRoaXMuY29udHJvbHMuZW5hYmxlRGFtcGluZyA9IHRydWU7CiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge3RoaXMuc2V0RGlydHkoKX0pOwogICAgdGhpcy5jb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7dGhpcy5zZXREaXJ0eSgpfSk7CgogICAgLyogc2V0IHVwIGd1aSAqLwogICAgdGhpcy5ndWkgPSBuZXcgR1VJKHthdXRvUGxhY2U6IGZhbHNlfSk7CiAgICB0aGlzLmRvbUVsZW1lbnQucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmd1aS5kb21FbGVtZW50KTsKICAgIHRoaXMuZ3VpLmRvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgdGhpcy5ndWkuZG9tRWxlbWVudC5zdHlsZS5yaWdodCA9IDA7CiAgICB0aGlzLmd1aS5kb21FbGVtZW50LnN0eWxlLnRvcCA9IDA7CgogICAgLyogc2V0IHVwIGFuaW1hdG9yIGFuZCBsb2FkIHRyYWplY3RvcnkgKi8KICAgIHRoaXMuYW5pbWF0b3IgPSBuZXcgQW5pbWF0b3IodGhpcyk7CiAgICB0aGlzLmFuaW1hdG9yLmxvYWQodGhpcy50cmFqZWN0b3J5LCB7fSk7CgogICAgLyogYWRkIGJvZHkgaW5zZXBjdG9ycyAqLwogICAgY29uc3QgYm9kaWVzRm9sZGVyID0gdGhpcy5ndWkuYWRkRm9sZGVyKCdCb2RpZXMnKTsKICAgIGJvZGllc0ZvbGRlci5vcGVuKCk7CgogICAgdGhpcy5ib2R5Rm9sZGVycyA9IHt9OwoKICAgIGZvciAobGV0IGMgb2YgdGhpcy5zY2VuZS5jaGlsZHJlbikgewogICAgICBpZiAoIWMubmFtZSkgY29udGludWU7CiAgICAgIGNvbnN0IGZvbGRlciA9IGJvZGllc0ZvbGRlci5hZGRGb2xkZXIoYy5uYW1lKTsKICAgICAgdGhpcy5ib2R5Rm9sZGVyc1tjLm5hbWVdID0gZm9sZGVyOwoKICAgICAgZnVuY3Rpb24gZGVmYXVsdHMoKSB7CiAgICAgICAgZm9yIChjb25zdCBndWkgb2YgYXJndW1lbnRzKSB7CiAgICAgICAgICBndWkuc3RlcCgwLjAxKS5saXN0ZW4oKS5kb21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlZmF1bHRzKAogICAgICAgICAgZm9sZGVyLmFkZChjLnBvc2l0aW9uLCAneCcpLm5hbWUoJ3Bvcy54JyksCiAgICAgICAgICBmb2xkZXIuYWRkKGMucG9zaXRpb24sICd5JykubmFtZSgncG9zLnknKSwKICAgICAgICAgIGZvbGRlci5hZGQoYy5wb3NpdGlvbiwgJ3onKS5uYW1lKCdwb3MueicpLAogICAgICAgICAgZm9sZGVyLmFkZChjLnBvc2l0aW9uLCAneCcpLm5hbWUoJ3JvdC54JyksCiAgICAgICAgICBmb2xkZXIuYWRkKGMucG9zaXRpb24sICd5JykubmFtZSgncm90LnknKSwKICAgICAgICAgIGZvbGRlci5hZGQoYy5wb3NpdGlvbiwgJ3onKS5uYW1lKCdyb3QueicpLAogICAgICApOwogICAgfQogICAgbGV0IHNhdmVGb2xkZXIgPSB0aGlzLmd1aS5hZGRGb2xkZXIoJ1NhdmUgLyBDYXB0dXJlJyk7CiAgICBzYXZlRm9sZGVyLmFkZCh0aGlzLCAnc2F2ZVNjZW5lJykubmFtZSgnU2F2ZSBTY2VuZScpOwogICAgc2F2ZUZvbGRlci5hZGQodGhpcywgJ3NhdmVJbWFnZScpLm5hbWUoJ0NhcHR1cmUgSW1hZ2UnKTsKCiAgICB0aGlzLmd1aS5jbG9zZSgpOwoKICAgIC8qIHNldCB1cCBib2R5IHNlbGVjdG9yICovCiAgICB0aGlzLnNlbGVjdG9yID0gbmV3IFNlbGVjdG9yKHRoaXMpOwogICAgdGhpcy5zZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICdob3Zlcm9uJywgKGV2dCkgPT4gdGhpcy5zZXRIb3ZlcihldnQub2JqZWN0LCB0cnVlKSk7CiAgICB0aGlzLnNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICAgJ2hvdmVyb2ZmJywgKGV2dCkgPT4gdGhpcy5zZXRIb3ZlcihldnQub2JqZWN0LCBmYWxzZSkpOwogICAgdGhpcy5zZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICdzZWxlY3QnLCAoZXZ0KSA9PiB0aGlzLnNldFNlbGVjdGVkKGV2dC5vYmplY3QsIHRydWUpKTsKICAgIHRoaXMuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAnZGVzZWxlY3QnLCAoZXZ0KSA9PiB0aGlzLnNldFNlbGVjdGVkKGV2dC5vYmplY3QsIGZhbHNlKSk7CgogICAgdGhpcy5kZWZhdWx0VGFyZ2V0ID0gdGhpcy5zZWxlY3Rvci5zZWxlY3RhYmxlWzBdOwogICAgdGhpcy50YXJnZXQgPSB0aGlzLmRlZmF1bHRUYXJnZXQ7CgogICAgLyogZ2V0IHJlYWR5IHRvIHJlbmRlciBmaXJzdCBmcmFtZSAqLwogICAgdGhpcy5zZXREaXJ0eSgpOwoKICAgIHdpbmRvdy5vbmxvYWQgPSAoZXZ0KSA9PiB0aGlzLnNldFNpemUoKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoZXZ0KSA9PiB0aGlzLnNldFNpemUoKSwgZmFsc2UpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuc2V0U2l6ZSgpKTsKCiAgICAvKiBzdGFydCBhbmltYXRpb24gKi8KICAgIHRoaXMuYW5pbWF0ZSgpOwogIH0KCiAgc2V0RGlydHkoKSB7CiAgICB0aGlzLm5lZWRzUmVuZGVyID0gdHJ1ZTsKICB9CgogIHNldFNpemUodywgaCkgewogICAgaWYgKHcgPT09IHVuZGVmaW5lZCkgewogICAgICB3ID0gdGhpcy5kb21FbGVtZW50Lm9mZnNldFdpZHRoOwogICAgfQogICAgaWYgKGggPT09IHVuZGVmaW5lZCkgewogICAgICBoID0gd2luZG93LmlubmVySGVpZ2h0OwogICAgfQogICAgaWYgKHRoaXMuY2FtZXJhLnR5cGUgPT0gJ09ydGhvZ3JhcGhpY0NhbWVyYScpIHsKICAgICAgdGhpcy5jYW1lcmEucmlnaHQgPQogICAgICAgICAgdGhpcy5jYW1lcmEubGVmdCArIHcgKiAodGhpcy5jYW1lcmEudG9wIC0gdGhpcy5jYW1lcmEuYm90dG9tKSAvIGg7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB3IC8gaDsKICAgIH0KICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh3LCBoKTsKICAgIHRoaXMuc2V0RGlydHkoKTsKICB9CgogIHJlbmRlcigpIHsKICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTsKICAgIHRoaXMubmVlZHNSZW5kZXIgPSBmYWxzZTsKICB9CgogIGFuaW1hdGUoKSB7CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5hbmltYXRlKCkpOwogICAgdGhpcy5hbmltYXRvci51cGRhdGUoKTsKCiAgICAvLyBtYWtlIHN1cmUgdGhlIG9yYml0ZXIgaXMgcG9pbnRlZCBhdCB0aGUgcmlnaHQgdGFyZ2V0CiAgICBjb25zdCB0YXJnZXRQb3MgPSBuZXcgVEhSRUUuVmVjdG9yMygpOwogICAgdGhpcy50YXJnZXQuZ2V0V29ybGRQb3NpdGlvbih0YXJnZXRQb3MpOwogICAgdGhpcy5jb250cm9scy50YXJnZXQgPSB0aGlzLmNvbnRyb2xzLnRhcmdldC5sZXJwKHRhcmdldFBvcywgMC4xKTsKICAgIGlmICh0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpKSB7CiAgICAgIHRoaXMuc2V0RGlydHkoKTsKICAgIH0KCiAgICAvLyBpZiB0aGUgdGFyZ2V0IGdldHMgdG9vIGZhciBmcm9tIHRoZSBjYW1lcmEsIG51ZGdlIHRoZSBjYW1lcmEKICAgIGlmICh0aGlzLmNhbWVyYS5mb2xsb3cgJiYKICAgICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKHRhcmdldFBvcykgPiB0aGlzLmNhbWVyYS5mb2xsb3dEaXN0YW5jZSkgewogICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwKHRhcmdldFBvcywgMC4wMSk7CiAgICAgIHRoaXMuc2V0RGlydHkoKTsKICAgIH0KCiAgICBpZiAodGhpcy5uZWVkc1JlbmRlcikgewogICAgICB0aGlzLnJlbmRlcigpOwogICAgfQogIH0KCiAgc2F2ZUltYWdlKCkgewogICAgdGhpcy5yZW5kZXIoKTsKICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC50b0RhdGFVUkwoKTsKICAgIGRvd25sb2FkRGF0YVVyaSgnYnJheC5wbmcnLCBpbWFnZURhdGEpOwogIH0KCiAgc2F2ZVNjZW5lKCkgewogICAgZG93bmxvYWRGaWxlKCdzeXN0ZW0uanNvbicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3lzdGVtKSk7CiAgfQoKICBzZXRIb3ZlcihvYmplY3QsIGhvdmVyaW5nKSB7CiAgICB0aGlzLnNldERpcnR5KCk7CiAgICBpZiAoIW9iamVjdC5zZWxlY3RlZCkgewogICAgICBvYmplY3QudHJhdmVyc2UoZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSB7CiAgICAgICAgICBjaGlsZC5tYXRlcmlhbCA9IGhvdmVyaW5nID8gaG92ZXJNYXRlcmlhbCA6IGNoaWxkLmJhc2VNYXRlcmlhbDsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgY29uc3QgdGl0bGVFbGVtZW50ID0KICAgICAgICB0aGlzLmJvZHlGb2xkZXJzW29iamVjdC5uYW1lXS5kb21FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy50aXRsZScpOwogICAgaWYgKHRpdGxlRWxlbWVudCkgewogICAgICB0aXRsZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gaG92ZXJpbmcgPyAnIzJmYTFkNicgOiAnIzAwMCc7CiAgICB9CiAgfQoKICBzZXRTZWxlY3RlZChvYmplY3QsIHNlbGVjdGVkKSB7CiAgICBvYmplY3Quc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgIHRoaXMudGFyZ2V0ID0gc2VsZWN0ZWQgPyBvYmplY3QgOiB0aGlzLmRlZmF1bHRUYXJnZXQ7CiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7CiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpIHsKICAgICAgICBjaGlsZC5tYXRlcmlhbCA9IHNlbGVjdGVkID8gc2VsZWN0TWF0ZXJpYWwgOiBjaGlsZC5iYXNlTWF0ZXJpYWw7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKG9iamVjdC5zZWxlY3RlZCkgewogICAgICB0aGlzLmJvZHlGb2xkZXJzW29iamVjdC5uYW1lXS5vcGVuKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvZHlGb2xkZXJzW29iamVjdC5uYW1lXS5jbG9zZSgpOwogICAgfQogICAgdGhpcy5zZXREaXJ0eSgpOwogIH0KfQoKZXhwb3J0IHtWaWV3ZXJ9Ow==", | |
"ok": true, | |
"headers": [ | |
[ | |
"content-type", | |
"application/javascript" | |
] | |
], | |
"status": 200, | |
"status_text": "" | |
}, | |
"http://localhost:32888/js/animator.js": { | |
"data": "aW1wb3J0ICogYXMgVEhSRUUgZnJvbSAnaHR0cHM6Ly90aHJlZWpzLm9yZy9idWlsZC90aHJlZS5tb2R1bGUuanMnOwoKY2xhc3MgQW5pbWF0b3IgewoKICBjb25zdHJ1Y3Rvcih2aWV3ZXIpIHsKICAgIHRoaXMudmlld2VyID0gdmlld2VyOwogICAgdGhpcy5taXhlciA9IG5ldyBUSFJFRS5BbmltYXRpb25NaXhlcih0aGlzLnZpZXdlci5zY2VuZSk7CiAgICB0aGlzLmNsb2NrID0gbmV3IFRIUkVFLkNsb2NrKCk7CiAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsKICAgIHRoaXMudGltZSA9IDA7CiAgICB0aGlzLnRpbWVTY3J1YmJlciA9IG51bGw7CiAgICB0aGlzLmR1cmF0aW9uID0gMDsKICB9CgogIHBsYXkoKSB7CiAgICB0aGlzLmNsb2NrLnN0YXJ0KCk7CiAgICB0aGlzLmFjdGlvbi5wbGF5KCk7CiAgICB0aGlzLnBsYXlpbmcgPSB0cnVlOwogIH0KCiAgcGF1c2UoKSB7CiAgICB0aGlzLmNsb2NrLnN0b3AoKTsKICAgIHRoaXMucGxheWluZyA9IGZhbHNlOwogIH0KCiAgcGxheVBhdXNlKCkgewogICAgaWYgKHRoaXMucGxheWluZykgewogICAgICB0aGlzLnBhdXNlKCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnBsYXkoKTsKICAgIH0KICB9CgogIGRpc3BsYXlQcm9ncmVzcyh0aW1lKSB7CiAgICB0aGlzLnRpbWUgPSB0aW1lOwogICAgaWYgKHRoaXMudGltZVNjcnViYmVyICE9PSBudWxsKSB7CiAgICAgIHRoaXMudGltZVNjcnViYmVyLnVwZGF0ZURpc3BsYXkoKTsKICAgIH0KICB9CgogIHNlZWsodGltZSkgewogICAgdGhpcy5hY3Rpb24udGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuYWN0aW9uLl9jbGlwLmR1cmF0aW9uLCB0aW1lKSk7CiAgICB0aGlzLm1peGVyLnVwZGF0ZSgwKTsKICAgIHRoaXMudmlld2VyLnNldERpcnR5KCk7CiAgfQoKICByZXNldCgpIHsKICAgIHRoaXMuYWN0aW9uLnJlc2V0KCk7CiAgICB0aGlzLmRpc3BsYXlQcm9ncmVzcygwKTsKICAgIHRoaXMubWl4ZXIudXBkYXRlKDApOwogICAgdGhpcy52aWV3ZXIuc2V0RGlydHkoKTsKICB9CgogIGNsZWFyKCkgewogICAgdGhpcy5taXhlci5zdG9wQWxsQWN0aW9uKCk7CiAgICB0aGlzLmFjdGlvbiA9IG51bGw7CiAgICB0aGlzLmR1cmF0aW9uID0gMDsKICAgIHRoaXMuZGlzcGxheVByb2dyZXNzKDApOwogICAgdGhpcy5taXhlciA9IG5ldyBUSFJFRS5BbmltYXRpb25NaXhlcih0aGlzLnZpZXdlci5zY2VuZSk7CiAgfQoKICBsb2FkKHRyYWplY3RvcnksIG9wdGlvbnMpIHsKICAgIHRoaXMuY2xlYXIoKTsKCiAgICBpZiAob3B0aW9ucy5wbGF5ID09PSB1bmRlZmluZWQpIHsKICAgICAgb3B0aW9ucy5wbGF5ID0gdHJ1ZQogICAgfQogICAgaWYgKG9wdGlvbnMubG9vcE1vZGUgPT09IHVuZGVmaW5lZCkgewogICAgICBvcHRpb25zLmxvb3BNb2RlID0gVEhSRUUuTG9vcFJlcGVhdAogICAgfQogICAgaWYgKG9wdGlvbnMucmVwZXRpdGlvbnMgPT09IHVuZGVmaW5lZCkgewogICAgICBvcHRpb25zLnJlcGV0aXRpb25zID0gMQogICAgfQogICAgaWYgKG9wdGlvbnMuY2xhbXBXaGVuRmluaXNoZWQgPT09IHVuZGVmaW5lZCkgewogICAgICBvcHRpb25zLmNsYW1wV2hlbkZpbmlzaGVkID0gdHJ1ZQogICAgfQoKICAgIHRoaXMuZHVyYXRpb24gPSAwOwogICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAgICB0aGlzLmFjdGlvbiA9IHRoaXMubWl4ZXIuY2xpcEFjdGlvbih0cmFqZWN0b3J5KTsKICAgIHRoaXMuYWN0aW9uLmNsYW1wV2hlbkZpbmlzaGVkID0gb3B0aW9ucy5jbGFtcFdoZW5GaW5pc2hlZDsKICAgIHRoaXMuYWN0aW9uLnNldExvb3Aob3B0aW9ucy5sb29wTW9kZSwgb3B0aW9ucy5yZXBldGl0aW9ucyk7CiAgICB0aGlzLmR1cmF0aW9uID0gdHJhamVjdG9yeS5kdXJhdGlvbjsKCiAgICBpZiAodGhpcy5kdXJhdGlvbiA+IDApIHsKICAgICAgdGhpcy5mb2xkZXIgPSB0aGlzLnZpZXdlci5ndWkuYWRkRm9sZGVyKCdUcmFqZWN0b3J5Jyk7CiAgICAgIHRoaXMuZm9sZGVyLm9wZW4oKTsKICAgICAgdGhpcy5mb2xkZXIuYWRkKHRoaXMsICdwbGF5UGF1c2UnKS5uYW1lKCdQbGF5IC8gUGF1c2UnKTsKICAgICAgdGhpcy5mb2xkZXIuYWRkKHRoaXMsICdyZXNldCcpLm5hbWUoJ1Jlc2V0Jyk7CgogICAgICB0aGlzLnRpbWVTY3J1YmJlciA9IHRoaXMuZm9sZGVyLmFkZCh0aGlzLCAndGltZScsIDAsIHRoaXMuZHVyYXRpb24sIDAuMDAxKTsKICAgICAgdGhpcy50aW1lU2NydWJiZXIub25DaGFuZ2UoKHZhbHVlKSA9PiB0aGlzLnNlZWsodmFsdWUpKTsKCiAgICAgIHRoaXMuZm9sZGVyLmFkZCh0aGlzLm1peGVyLCAndGltZVNjYWxlJykuc3RlcCgwLjAxKS5taW4oMCk7CiAgICB9CgogICAgdGhpcy5yZXNldCgpOwogICAgaWYgKG9wdGlvbnMucGxheSkgewogICAgICB0aGlzLnBsYXkoKTsKICAgIH0KICB9CgogIHVwZGF0ZSgpIHsKICAgIGlmICh0aGlzLnBsYXlpbmcpIHsKICAgICAgdGhpcy5taXhlci51cGRhdGUodGhpcy5jbG9jay5nZXREZWx0YSgpKTsKICAgICAgdGhpcy52aWV3ZXIuc2V0RGlydHkoKTsKICAgICAgaWYgKHRoaXMuZHVyYXRpb24gIT0gMCkgewogICAgICAgIHRoaXMuZGlzcGxheVByb2dyZXNzKHRoaXMuYWN0aW9uLnRpbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZGlzcGxheVByb2dyZXNzKDApOwogICAgICB9CgogICAgICBpZiAodGhpcy5hY3Rpb24ucGF1c2VkKSB7CiAgICAgICAgdGhpcy5wYXVzZSgpOwogICAgICAgIHRoaXMuYWN0aW9uLnJlc2V0KCk7CiAgICAgIH0KICAgIH0KICB9CgogIGFmdGVyUmVuZGVyKCkgewogICAgaWYgKHRoaXMucmVjb3JkaW5nKSB7CiAgICAgIHRoaXMuY2FwdHVyZXIuY2FwdHVyZSh0aGlzLnZpZXdlci5yZW5kZXJlci5kb21FbGVtZW50KTsKICAgIH0KICB9Cn0KCmV4cG9ydCB7IEFuaW1hdG9yIH07", | |
"ok": true, | |
"headers": [ | |
[ | |
"content-type", | |
"application/javascript" | |
] | |
], | |
"status": 200, | |
"status_text": "" | |
}, | |
"http://localhost:32888/js/selector.js": { | |
"data": "aW1wb3J0ICogYXMgVEhSRUUgZnJvbSAnaHR0cHM6Ly90aHJlZWpzLm9yZy9idWlsZC90aHJlZS5tb2R1bGUuanMnOwoKY2xhc3MgU2VsZWN0b3IgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXIgewogIGNvbnN0cnVjdG9yKHZpZXdlcikgewogICAgc3VwZXIoKTsKCiAgICBjb25zdCBpZ25vcmUgPSBbJ3RhcmdldCcsICdncm91bmQnXTsKCiAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKICAgIHRoaXMucmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpOwogICAgdGhpcy5tb3VzZVBvcyA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7CiAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDsKICAgIHRoaXMuaG92ZXJlZCA9IG51bGw7CiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7CiAgICB0aGlzLnNlbGVjdGFibGUgPSB2aWV3ZXIuc2NlbmUuY2hpbGRyZW4uZmlsdGVyKAogICAgICAgIG8gPT4KICAgICAgICAgICAgbyBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwICYmICFpZ25vcmUuaW5jbHVkZXMoby5uYW1lLnRvTG93ZXJDYXNlKCkpKTsKCiAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy52aWV3ZXIuZG9tRWxlbWVudDsKICAgIGRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUuYmluZCh0aGlzKSk7CiAgICBkb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vblBvaW50ZXJEb3duLmJpbmQodGhpcykpOwogICAgZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwLmJpbmQodGhpcykpOwogIH0KCiAgb25Qb2ludGVyTW92ZShldmVudCkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlOwoKICAgIGNvbnN0IHJlY3QgPSB0aGlzLnZpZXdlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdGhpcy5tb3VzZVBvcy54ID0gKChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpICogMiAtIDE7CiAgICB0aGlzLm1vdXNlUG9zLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7CiAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2VQb3MsIHRoaXMudmlld2VyLmNhbWVyYSk7CiAgICBjb25zdCBpbnRlcnNlY3Rpb25zID0KICAgICAgICB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuc2VsZWN0YWJsZSwgdHJ1ZSk7CgogICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICBsZXQgb2JqZWN0ID0gaW50ZXJzZWN0aW9uc1swXS5vYmplY3Q7CiAgICAgIHdoaWxlIChvYmplY3QucGFyZW50ICYmICFvYmplY3QubmFtZSkgewogICAgICAgIG9iamVjdCA9IG9iamVjdC5wYXJlbnQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaG92ZXJlZCAhPT0gb2JqZWN0KSB7CiAgICAgICAgaWYgKHRoaXMuaG92ZXJlZCkgewogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAnaG92ZXJvZmYnLCBvYmplY3Q6IHRoaXMuaG92ZXJlZH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmhvdmVyZWQgPSBvYmplY3Q7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAnaG92ZXJvbicsIG9iamVjdDogdGhpcy5ob3ZlcmVkfSk7CiAgICAgICAgdGhpcy52aWV3ZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGhpcy5ob3ZlcmVkICE9PSBudWxsKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZTogJ2hvdmVyb2ZmJywgb2JqZWN0OiB0aGlzLmhvdmVyZWR9KTsKCiAgICAgIHRoaXMudmlld2VyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2F1dG8nOwogICAgICB0aGlzLmhvdmVyZWQgPSBudWxsOwogICAgfQogIH0KCiAgb25Qb2ludGVyRG93bihldmVudCkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKICB9CgogIG9uUG9pbnRlclVwKGV2ZW50KSB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHJldHVybjsgIC8vIGlnbm9yZSBkcmFnIGV2ZW50cywgb25seSBoYW5kbGUgY2xpY2tzCiAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2VQb3MsIHRoaXMudmlld2VyLmNhbWVyYSk7CiAgICBjb25zdCBpbnRlcnNlY3Rpb25zID0KICAgICAgICB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuc2VsZWN0YWJsZSwgdHJ1ZSk7CgogICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkgewogICAgICBsZXQgb2JqZWN0ID0gaW50ZXJzZWN0aW9uc1swXS5vYmplY3Q7CiAgICAgIHdoaWxlIChvYmplY3QucGFyZW50ICYmICFvYmplY3QubmFtZSkgewogICAgICAgIG9iamVjdCA9IG9iamVjdC5wYXJlbnQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQgIT09IG9iamVjdCkgewogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ICdkZXNlbGVjdCcsIG9iamVjdDogdGhpcy5zZWxlY3RlZH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdGVkID0gb2JqZWN0OwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZTogJ3NlbGVjdCcsIG9iamVjdDogdGhpcy5zZWxlY3RlZH0pOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWQgIT09IG51bGwpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAnZGVzZWxlY3QnLCBvYmplY3Q6IHRoaXMuc2VsZWN0ZWR9KTsKICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7CiAgICB9CiAgfQp9CgpleHBvcnQge1NlbGVjdG9yfTsK", | |
"ok": true, | |
"headers": [ | |
[ | |
"content-type", | |
"application/javascript" | |
] | |
], | |
"status": 200, | |
"status_text": "" | |
}, | |
"http://localhost:32888/js/system.js": { | |
"data": "aW1wb3J0ICogYXMgVEhSRUUgZnJvbSAnaHR0cHM6Ly90aHJlZWpzLm9yZy9idWlsZC90aHJlZS5tb2R1bGUuanMnOwoKY29uc3QgYmFzaWNNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7Y29sb3I6IDB4NjY1NTQ0fSk7CmNvbnN0IHRhcmdldE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogMHhmZjIyMjJ9KTsKCmZ1bmN0aW9uIGNyZWF0ZUNhcHN1bGUoY2Fwc3VsZSkgewogIGNvbnN0IHNwaGVyZV9nZW9tID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KGNhcHN1bGUucmFkaXVzLCAxNiwgMTYpOwogIGNvbnN0IGN5bGluZGVyX2dlb20gPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgKICAgICAgY2Fwc3VsZS5yYWRpdXMsIGNhcHN1bGUucmFkaXVzLCBjYXBzdWxlLmxlbmd0aCAtIDIgKiBjYXBzdWxlLnJhZGl1cyk7CgogIGNvbnN0IHNwaGVyZTEgPSBuZXcgVEhSRUUuTWVzaChzcGhlcmVfZ2VvbSwgYmFzaWNNYXRlcmlhbCk7CiAgc3BoZXJlMS5iYXNlTWF0ZXJpYWwgPSBzcGhlcmUxLm1hdGVyaWFsOwogIHNwaGVyZTEucG9zaXRpb24uc2V0KDAsIGNhcHN1bGUubGVuZ3RoIC8gMiAtIGNhcHN1bGUucmFkaXVzLCAwKTsKICBzcGhlcmUxLmNhc3RTaGFkb3cgPSB0cnVlOwoKICBjb25zdCBzcGhlcmUyID0gbmV3IFRIUkVFLk1lc2goc3BoZXJlX2dlb20sIGJhc2ljTWF0ZXJpYWwpOwogIHNwaGVyZTIuYmFzZU1hdGVyaWFsID0gc3BoZXJlMi5tYXRlcmlhbDsKICBzcGhlcmUyLnBvc2l0aW9uLnNldCgwLCAtY2Fwc3VsZS5sZW5ndGggLyAyICsgY2Fwc3VsZS5yYWRpdXMsIDApOwogIHNwaGVyZTIuY2FzdFNoYWRvdyA9IHRydWU7CgogIGNvbnN0IGN5bGluZGVyID0gbmV3IFRIUkVFLk1lc2goY3lsaW5kZXJfZ2VvbSwgYmFzaWNNYXRlcmlhbCk7CiAgY3lsaW5kZXIuYmFzZU1hdGVyaWFsID0gY3lsaW5kZXIubWF0ZXJpYWw7CiAgY3lsaW5kZXIuY2FzdFNoYWRvdyA9IHRydWU7CgogIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7CiAgZ3JvdXAuYWRkKHNwaGVyZTEsIHNwaGVyZTIsIGN5bGluZGVyKTsKICByZXR1cm4gZ3JvdXA7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUJveChib3gpIHsKICBjb25zdCBnZW9tID0gbmV3IFRIUkVFLkJveEJ1ZmZlckdlb21ldHJ5KAogICAgICAyICogYm94LmhhbGZzaXplLngsIDIgKiBib3guaGFsZnNpemUueiwgMiAqIGJveC5oYWxmc2l6ZS55KTsKICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbSwgYmFzaWNNYXRlcmlhbCk7CiAgbWVzaC5jYXN0U2hhZG93ID0gdHJ1ZTsKICBtZXNoLmJhc2VNYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7CiAgcmV0dXJuIG1lc2g7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVBsYW5lKHBsYW5lKSB7CiAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTsKICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goCiAgICAgIG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDIwMDAsIDIwMDApLAogICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiAweDk5OTk5OSwgZGVwdGhXcml0ZTogZmFsc2V9KSk7CiAgbWVzaC5yb3RhdGlvbi54ID0gLU1hdGguUEkgLyAyOwogIG1lc2gucmVjZWl2ZVNoYWRvdyA9IHRydWU7CiAgbWVzaC5iYXNlTWF0ZXJpYWwgPSBtZXNoLm1hdGVyaWFsOwogIGdyb3VwLmFkZChtZXNoKTsKCiAgY29uc3QgbWVzaDIgPSBuZXcgVEhSRUUuR3JpZEhlbHBlcigyMDAwLCAyMDAwLCAweDAwMDAwMCwgMHgwMDAwMDApOwogIG1lc2gyLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjQ7CiAgbWVzaDIubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlOwogIG1lc2gyLmJhc2VNYXRlcmlhbCA9IG1lc2gyLm1hdGVyaWFsOwogIGdyb3VwLmFkZChtZXNoMik7CiAgcmV0dXJuIGdyb3VwOwp9CgpmdW5jdGlvbiBjcmVhdGVTcGhlcmUoc3BoZXJlLCBuYW1lKSB7CiAgY29uc3QgZ2VvbSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShzcGhlcmUucmFkaXVzLCAxNiwgMTYpOwogIGxldCBtYXQgPSBuYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ3RhcmdldCcgPyB0YXJnZXRNYXRlcmlhbCA6IGJhc2ljTWF0ZXJpYWw7CiAgY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb20sIG1hdCk7CiAgbWVzaC5jYXN0U2hhZG93ID0gdHJ1ZTsKICBtZXNoLmJhc2VNYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7CiAgcmV0dXJuIG1lc2g7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVNjZW5lKHN5c3RlbSkgewogIGNvbnN0IHNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7CgogIHN5c3RlbS5jb25maWcuYm9kaWVzLmZvckVhY2goZnVuY3Rpb24oYm9keSkgewogICAgY29uc3QgcGFyZW50ID0gbmV3IFRIUkVFLkdyb3VwKCk7CiAgICBwYXJlbnQubmFtZSA9IGJvZHkubmFtZS5yZXBsYWNlQWxsKCcvJywgJ18nKTsgLy8gc2FuaXRpemUgbm9kZSBuYW1lCiAgICBib2R5LmNvbGxpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGNvbGxpZGVyKSB7CiAgICAgIGxldCBjaGlsZDsKICAgICAgaWYgKCdib3gnIGluIGNvbGxpZGVyKSB7CiAgICAgICAgY2hpbGQgPSBjcmVhdGVCb3goY29sbGlkZXIuYm94KTsKICAgICAgfSBlbHNlIGlmICgnY2Fwc3VsZScgaW4gY29sbGlkZXIpIHsKICAgICAgICBjaGlsZCA9IGNyZWF0ZUNhcHN1bGUoY29sbGlkZXIuY2Fwc3VsZSk7CiAgICAgIH0gZWxzZSBpZiAoJ3BsYW5lJyBpbiBjb2xsaWRlcikgewogICAgICAgIGNoaWxkID0gY3JlYXRlUGxhbmUoY29sbGlkZXIucGxhbmUpOwogICAgICB9IGVsc2UgaWYgKCdzcGhlcmUnIGluIGNvbGxpZGVyKSB7CiAgICAgICAgY2hpbGQgPSBjcmVhdGVTcGhlcmUoY29sbGlkZXIuc3BoZXJlLCBib2R5Lm5hbWUpOwogICAgICB9CiAgICAgIGlmIChjb2xsaWRlci5yb3RhdGlvbikgewogICAgICAgIC8vIGNvbnZlcnQgZnJvbSB6LXVwIHRvIHktdXAgY29vcmRpbmF0ZSBzeXN0ZW0KICAgICAgICBjb25zdCByb3QgPSBuZXcgVEhSRUUuVmVjdG9yMyhjb2xsaWRlci5yb3RhdGlvbi54LCBjb2xsaWRlci5yb3RhdGlvbi55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpZGVyLnJvdGF0aW9uLnopOwogICAgICAgIHJvdC5tdWx0aXBseVNjYWxhcihNYXRoLlBJIC8gMTgwKTsKICAgICAgICBjb25zdCBldWwgPSBuZXcgVEhSRUUuRXVsZXIoKTsKICAgICAgICBldWwuc2V0RnJvbVZlY3RvcjMocm90KTsKICAgICAgICBjaGlsZC5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihldWwpOwogICAgICAgIGNoaWxkLnF1YXRlcm5pb24ueCA9IC1jaGlsZC5xdWF0ZXJuaW9uLng7CiAgICAgICAgY29uc3QgdG1wID0gY2hpbGQucXVhdGVybmlvbi55OwogICAgICAgIGNoaWxkLnF1YXRlcm5pb24ueSA9IC1jaGlsZC5xdWF0ZXJuaW9uLno7CiAgICAgICAgY2hpbGQucXVhdGVybmlvbi56ID0gLXRtcDsKICAgICAgfQogICAgICBpZiAoY29sbGlkZXIucG9zaXRpb24pIHsKICAgICAgICBjaGlsZC5wb3NpdGlvbi5zZXQoY29sbGlkZXIucG9zaXRpb24ueCwgY29sbGlkZXIucG9zaXRpb24ueiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlkZXIucG9zaXRpb24ueSk7CiAgICAgIH0KICAgICAgcGFyZW50LmFkZChjaGlsZCk7CiAgICB9KTsKICAgIHNjZW5lLmFkZChwYXJlbnQpOwogIH0pOwoKICByZXR1cm4gc2NlbmU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVRyYWplY3Rvcnkoc3lzdGVtKSB7CiAgY29uc3QgdGltZXMgPSBbLi4uQXJyYXkoc3lzdGVtLnBvcy5sZW5ndGgpLmtleXMoKV0ubWFwKHggPT4geCAqIHN5c3RlbS5jb25maWcuZHQpOwogIGNvbnN0IHRyYWNrcyA9IFtdOwoKICBzeXN0ZW0uY29uZmlnLmJvZGllcy5mb3JFYWNoKGZ1bmN0aW9uKGJvZHksIGJpKSB7CiAgICBjb25zdCBncm91cCA9IGJvZHkubmFtZS5yZXBsYWNlQWxsKCcvJywgJ18nKTsgLy8gc2FuaXRpemUgbm9kZSBuYW1lCiAgICBjb25zdCBwb3MgPSBzeXN0ZW0ucG9zLm1hcChwID0+IFtwW2JpXVswXSwgcFtiaV1bMl0sIHBbYmldWzFdXSk7CiAgICBjb25zdCByb3QgPQogICAgICAgIHN5c3RlbS5yb3QubWFwKHIgPT4gWy1yW2JpXVsxXSwgLXJbYmldWzNdLCAtcltiaV1bMl0sIHJbYmldWzBdXSk7CiAgICB0cmFja3MucHVzaChuZXcgVEhSRUUuVmVjdG9yS2V5ZnJhbWVUcmFjaygKICAgICAgICAnc2NlbmUvJyArIGdyb3VwICsgJy5wb3NpdGlvbicsIHRpbWVzLCBwb3MuZmxhdCgpKSk7CiAgICB0cmFja3MucHVzaChuZXcgVEhSRUUuUXVhdGVybmlvbktleWZyYW1lVHJhY2soCiAgICAgICAgJ3NjZW5lLycgKyBncm91cCArICcucXVhdGVybmlvbicsIHRpbWVzLCByb3QuZmxhdCgpKSk7CiAgfSk7CgogIHJldHVybiBuZXcgVEhSRUUuQW5pbWF0aW9uQ2xpcCgnQWN0aW9uJywgLTEsIHRyYWNrcyk7Cn0KCmV4cG9ydCB7IGNyZWF0ZVNjZW5lLCBjcmVhdGVUcmFqZWN0b3J5IH07Cg==", | |
"ok": true, | |
"headers": [ | |
[ | |
"content-type", | |
"application/javascript" | |
] | |
], | |
"status": 200, | |
"status_text": "" | |
} | |
}, | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
}, | |
"id": "NaJDZqhCLovU", | |
"outputId": "ce04ec44-379f-49b9-b9f3-2ae70d9fc880" | |
}, | |
"source": [ | |
"# patch brax.io.html to refer to local url\n", | |
"html._HTML = html._HTML.replace(\"https://cdn.jsdelivr.net/gh/google/brax@a93dadc48a41177a4d9e7794ce17c1ad98ed8583\", f\"https://localhost:{port}\")\n", | |
"\n", | |
"#@title Visualizing pre-included Brax environments { run: \"auto\" }\n", | |
"\n", | |
"env_name = \"ant\" # @param ['ant', 'humanoid', 'fetch', 'grasp', 'halfcheetah', 'ur5e', 'reacher']\n", | |
"env_fn = envs.create_fn(env_name=env_name)\n", | |
"env = env_fn()\n", | |
"jit_env_reset = jax.jit(env.reset)\n", | |
"state = jit_env_reset(rng=jax.random.PRNGKey(seed=0))\n", | |
"\n", | |
"def visualize(sys, qps):\n", | |
" \"\"\"Renders a 3D visualization of the environment.\"\"\"\n", | |
" return HTML(html.render(sys, qps))\n", | |
"\n", | |
"visualize(env.sys, [state.qp])" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" | |
], | |
"name": "stderr" | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"\n", | |
"<html>\n", | |
"\n", | |
" <head>\n", | |
" <title>Brax visualizer</title>\n", | |
" <style>\n", | |
" body {\n", | |
" margin: 0;\n", | |
" padding: 0;\n", | |
" }\n", | |
"\n", | |
" #brax-viewer {\n", | |
" margin: 0;\n", | |
" padding: 0;\n", | |
" height: 480px;\n", | |
" }\n", | |
" </style>\n", | |
" </head>\n", | |
"\n", | |
" <body>\n", | |
" <script type=\"application/javascript\">\n", | |
" var system = {\"config\": {\"bodies\": [{\"name\": \"$ Torso\", \"colliders\": [{\"capsule\": {\"radius\": 0.25, \"length\": 0.5, \"end\": 1}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 10.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"Aux 1\", \"colliders\": [{\"rotation\": {\"x\": 90.0, \"y\": -45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.44284272, \"end\": 0}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"$ Body 4\", \"colliders\": [{\"rotation\": {\"x\": 90.0, \"y\": -45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.7256854, \"end\": -1}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"Aux 2\", \"colliders\": [{\"rotation\": {\"x\": 90.0, \"y\": 45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.44284272, \"end\": 0}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"$ Body 7\", \"colliders\": [{\"rotation\": {\"x\": 90.0, \"y\": 45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.7256854, \"end\": -1}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"Aux 3\", \"colliders\": [{\"rotation\": {\"x\": -90.0, \"y\": 45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.44284272, \"end\": 0}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"$ Body 10\", \"colliders\": [{\"rotation\": {\"x\": -90.0, \"y\": 45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.7256854, \"end\": -1}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"Aux 4\", \"colliders\": [{\"rotation\": {\"x\": -90.0, \"y\": -45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.44284272, \"end\": 0}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"$ Body 13\", \"colliders\": [{\"rotation\": {\"x\": -90.0, \"y\": -45.0, \"z\": 0.0}, \"capsule\": {\"radius\": 0.08, \"length\": 0.7256854, \"end\": -1}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"rotation\": {\"x\": 0.0, \"y\": 0.0, \"z\": 0.0}, \"all\": false}}, {\"name\": \"Ground\", \"colliders\": [{\"plane\": {}}], \"inertia\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"mass\": 1.0, \"frozen\": {\"position\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"rotation\": {\"x\": 1.0, \"y\": 1.0, \"z\": 1.0}, \"all\": true}}], \"joints\": [{\"name\": \"$ Torso_Aux 1\", \"stiffness\": 5000.0, \"parent\": \"$ Torso\", \"child\": \"Aux 1\", \"parentOffset\": {\"x\": 0.2, \"y\": 0.2, \"z\": 0.0}, \"childOffset\": {\"x\": -0.1, \"y\": -0.1, \"z\": 0.0}, \"rotation\": {\"y\": -90.0, \"x\": 0.0, \"z\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -30.0, \"max\": 30.0}]}, {\"name\": \"Aux 1_$ Body 4\", \"stiffness\": 5000.0, \"parent\": \"Aux 1\", \"child\": \"$ Body 4\", \"parentOffset\": {\"x\": 0.1, \"y\": 0.1, \"z\": 0.0}, \"childOffset\": {\"x\": -0.2, \"y\": -0.2, \"z\": 0.0}, \"rotation\": {\"z\": 135.0, \"x\": 0.0, \"y\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": 30.0, \"max\": 70.0}]}, {\"name\": \"$ Torso_Aux 2\", \"stiffness\": 5000.0, \"parent\": \"$ Torso\", \"child\": \"Aux 2\", \"parentOffset\": {\"x\": -0.2, \"y\": 0.2, \"z\": 0.0}, \"childOffset\": {\"x\": 0.1, \"y\": -0.1, \"z\": 0.0}, \"rotation\": {\"y\": -90.0, \"x\": 0.0, \"z\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -30.0, \"max\": 30.0}]}, {\"name\": \"Aux 2_$ Body 7\", \"stiffness\": 5000.0, \"parent\": \"Aux 2\", \"child\": \"$ Body 7\", \"parentOffset\": {\"x\": -0.1, \"y\": 0.1, \"z\": 0.0}, \"childOffset\": {\"x\": 0.2, \"y\": -0.2, \"z\": 0.0}, \"rotation\": {\"z\": 45.0, \"x\": 0.0, \"y\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -70.0, \"max\": -30.0}]}, {\"name\": \"$ Torso_Aux 3\", \"stiffness\": 5000.0, \"parent\": \"$ Torso\", \"child\": \"Aux 3\", \"parentOffset\": {\"x\": -0.2, \"y\": -0.2, \"z\": 0.0}, \"childOffset\": {\"x\": 0.1, \"y\": 0.1, \"z\": 0.0}, \"rotation\": {\"y\": -90.0, \"x\": 0.0, \"z\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -30.0, \"max\": 30.0}]}, {\"name\": \"Aux 3_$ Body 10\", \"stiffness\": 5000.0, \"parent\": \"Aux 3\", \"child\": \"$ Body 10\", \"parentOffset\": {\"x\": -0.1, \"y\": -0.1, \"z\": 0.0}, \"childOffset\": {\"x\": 0.2, \"y\": 0.2, \"z\": 0.0}, \"rotation\": {\"z\": 135.0, \"x\": 0.0, \"y\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -70.0, \"max\": -30.0}]}, {\"name\": \"$ Torso_Aux 4\", \"stiffness\": 5000.0, \"parent\": \"$ Torso\", \"child\": \"Aux 4\", \"parentOffset\": {\"x\": 0.2, \"y\": -0.2, \"z\": 0.0}, \"childOffset\": {\"x\": -0.1, \"y\": 0.1, \"z\": 0.0}, \"rotation\": {\"y\": -90.0, \"x\": 0.0, \"z\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": -30.0, \"max\": 30.0}]}, {\"name\": \"Aux 4_$ Body 13\", \"stiffness\": 5000.0, \"parent\": \"Aux 4\", \"child\": \"$ Body 13\", \"parentOffset\": {\"x\": 0.1, \"y\": -0.1, \"z\": 0.0}, \"childOffset\": {\"x\": -0.2, \"y\": 0.2, \"z\": 0.0}, \"rotation\": {\"z\": 45.0, \"x\": 0.0, \"y\": 0.0}, \"angularDamping\": 35.0, \"angleLimit\": [{\"min\": 30.0, \"max\": 70.0}]}], \"actuators\": [{\"name\": \"$ Torso_Aux 1\", \"joint\": \"$ Torso_Aux 1\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"Aux 1_$ Body 4\", \"joint\": \"Aux 1_$ Body 4\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"$ Torso_Aux 2\", \"joint\": \"$ Torso_Aux 2\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"Aux 2_$ Body 7\", \"joint\": \"Aux 2_$ Body 7\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"$ Torso_Aux 3\", \"joint\": \"$ Torso_Aux 3\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"Aux 3_$ Body 10\", \"joint\": \"Aux 3_$ Body 10\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"$ Torso_Aux 4\", \"joint\": \"$ Torso_Aux 4\", \"strength\": 300.0, \"torque\": {}}, {\"name\": \"Aux 4_$ Body 13\", \"joint\": \"Aux 4_$ Body 13\", \"strength\": 300.0, \"torque\": {}}], \"friction\": 0.6, \"gravity\": {\"z\": -9.8, \"x\": 0.0, \"y\": 0.0}, \"angularDamping\": -0.05, \"baumgarteErp\": 0.1, \"collideInclude\": [{\"first\": \"$ Torso\", \"second\": \"Ground\"}, {\"first\": \"$ Body 4\", \"second\": \"Ground\"}, {\"first\": \"$ Body 7\", \"second\": \"Ground\"}, {\"first\": \"$ Body 10\", \"second\": \"Ground\"}, {\"first\": \"$ Body 13\", \"second\": \"Ground\"}], \"dt\": 0.05, \"substeps\": 10, \"frozen\": {\"all\": false}, \"elasticity\": 0.0, \"velocityDamping\": 0.0}, \"pos\": [[[0.0, 0.0, 0.5133401155471802], [0.30000001192092896, 0.30000001192092896, 0.5133401155471802], [0.528557538986206, 0.528557538986206, 0.29667001962661743], [-0.30000001192092896, 0.30000001192092896, 0.5133401155471802], [-0.528557538986206, 0.528557538986206, 0.29667001962661743], [-0.30000001192092896, -0.30000001192092896, 0.5133401155471802], [-0.528557538986206, -0.528557538986206, 0.29667001962661743], [0.30000001192092896, -0.30000001192092896, 0.5133401155471802], [0.528557538986206, -0.528557538986206, 0.29667001962661743], [0.0, 0.0, 0.0]]], \"rot\": [[[1.0, 0.0, 0.0, 0.0], [1.0, 0.0, -0.0, 0.0], [0.9063077569007874, -0.2988363206386566, 0.2988361716270447, 0.0], [1.0, 0.0, -0.0, 0.0], [0.9063077569007874, -0.29883620142936707, -0.29883626103401184, 0.0], [1.0, 0.0, -0.0, 0.0], [0.9063077569007874, 0.2988363206386566, -0.2988361716270447, 0.0], [1.0, 0.0, -0.0, 0.0], [0.9063077569007874, 0.29883620142936707, 0.29883626103401184, 0.0], [1.0, 0.0, 0.0, 0.0]]]};\n", | |
" </script>\n", | |
"\n", | |
" <div id=\"brax-viewer\"></div>\n", | |
"\n", | |
" <script type=\"module\">\n", | |
" import {Viewer} from 'https://localhost:32888/js/viewer.js';\n", | |
" const domElement = document.getElementById('brax-viewer');\n", | |
" var viewer = new Viewer(domElement, system);\n", | |
" </script>\n", | |
" </body>\n", | |
"</html>\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 4 | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment