seveibar/led-water-accelerometer
This is an LED matrix with an accelerometer and a PICO. When you tilt the PCB, the LEDs dim and change color to simulate water flowing.
- Version
- 1.0.18
- License
- unset
- Stars
- 7
firmware/tscircuit-in-motion
ZnJvbSBtYWNoaW5lIGltcG9ydCBQaW4KaW1wb3J0IG5lb3BpeGVsCmltcG9ydCB0aW1lCgojIOKUgOKUgOKUgOKUgOKUgCBMRUQgU2V0dXAg4pSA4pSA4pSA4pSA4pSACkxFRF9QSU4gPSA2CkNPTFMsIFJPV1MgPSA3LCA2ICAjIDcgY29sdW1ucywgNiByb3dzIGJhc2VkIG9uIHlvdXIgc2V0dXAKTlVNX0xFRFMgPSBDT0xTICogUk9XUwpucCA9IG5lb3BpeGVsLk5lb1BpeGVsKFBpbihMRURfUElOKSwgTlVNX0xFRFMpCgpjbGFzcyBOZW9QaXhlbE1hdHJpeDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZW9waXhlbF9zdHJpcCwgY29scywgcm93cyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGl6ZSB0aGUgTmVvUGl4ZWwgTWF0cml4CiAgICAgICAgbmVvcGl4ZWxfc3RyaXA6IHRoZSBuZW9waXhlbCBvYmplY3QKICAgICAgICBjb2xzOiBudW1iZXIgb2YgY29sdW1ucyAoNykKICAgICAgICByb3dzOiBudW1iZXIgb2Ygcm93cyAoNikKICAgICAgICAiIiIKICAgICAgICBzZWxmLm5wID0gbmVvcGl4ZWxfc3RyaXAKICAgICAgICBzZWxmLmNvbHMgPSBjb2xzCiAgICAgICAgc2VsZi5yb3dzID0gcm93cwogICAgICAgIHNlbGYuY2xlYXJfbWF0cml4KCkKICAgICAgICAKICAgIGRlZiB4eV90b19pbmRleChzZWxmLCB4LCB5KToKICAgICAgICAiIiJDb252ZXJ0IHgseSBjb29yZGluYXRlcyB0byBOZW9QaXhlbCBpbmRleCIiIgogICAgICAgICMgQWRqdXN0IHRoaXMgYmFzZWQgb24gaG93IHlvdXIgTEVEcyBhcmUgd2lyZWQKICAgICAgICAjIFRoaXMgYXNzdW1lcyByb3ctbWFqb3Igb3JkZXI6IHJvdyAwOiAwLTYsIHJvdyAxOiA3LTEzLCBldGMuCiAgICAgICAgcmV0dXJuIHkgKiBzZWxmLmNvbHMgKyB4CiAgICAKICAgIGRlZiBjbGVhcl9tYXRyaXgoc2VsZik6CiAgICAgICAgIiIiVHVybiBvZmYgYWxsIExFRHMiIiIKICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fTEVEUyk6CiAgICAgICAgICAgIHNlbGYubnBbaV0gPSAoMCwgMCwgMCkKICAgICAgICBzZWxmLm5wLndyaXRlKCkKICAgIAogICAgZGVmIHNldF9waXhlbChzZWxmLCB4LCB5LCBjb2xvcik6CiAgICAgICAgIiIiU2V0IGEgc2luZ2xlIHBpeGVsIHRvIGEgY29sb3IiIiIKICAgICAgICBpZiAwIDw9IHggPCBzZWxmLmNvbHMgYW5kIDAgPD0geSA8IHNlbGYucm93czoKICAgICAgICAgICAgaWR4ID0gc2VsZi54eV90b19pbmRleCh4LCB5KQogICAgICAgICAgICBzZWxmLm5wW2lkeF0gPSBjb2xvcgogICAgCiAgICBkZWYgZGlzcGxheV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGNvbG9yPSg1MCwgMCwgMCksIGR1cmF0aW9uPTIpOgogICAgICAgICIiIgogICAgICAgIERpc3BsYXkgYSBwYXR0ZXJuIG9uIHRoZSBMRUQgbWF0cml4CiAgICAgICAgcGF0dGVybjogNng3IGxpc3Qgb2YgbGlzdHMgd2l0aCAxcyBhbmQgMHMgKG5vdGU6IHJvd3MgeCBjb2xzKQogICAgICAgIGNvbG9yOiBSR0IgdHVwbGUgZm9yIGxpdCBMRURzCiAgICAgICAgZHVyYXRpb246IGhvdyBsb25nIHRvIGRpc3BsYXkgaW4gc2Vjb25kcwogICAgICAgICIiIgogICAgICAgIHNlbGYuY2xlYXJfbWF0cml4KCkKICAgICAgICAKICAgICAgICAjIERpc3BsYXkgdGhlIHBhdHRlcm4KICAgICAgICBmb3Igcm93X2lkeCwgcm93X3BhdHRlcm4gaW4gZW51bWVyYXRlKHBhdHRlcm4pOgogICAgICAgICAgICBmb3IgY29sX2lkeCwgbGVkX3N0YXRlIGluIGVudW1lcmF0ZShyb3dfcGF0dGVybik6CiAgICAgICAgICAgICAgICBpZiBsZWRfc3RhdGUgPT0gMToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9waXhlbChjb2xfaWR4LCByb3dfaWR4LCBjb2xvcikKICAgICAgICAKICAgICAgICBzZWxmLm5wLndyaXRlKCkKICAgICAgICB0aW1lLnNsZWVwKGR1cmF0aW9uKQoKIyBDb21wYWN0IGxldHRlciBwYXR0ZXJucyAoNSBwaXhlbHMgd2lkZSB4IDYgcGl4ZWxzIHRhbGwgZm9yIGJldHRlciBwcm9wb3J0aW9ucykKTEVUVEVSX1BBVFRFUk5TID0gewogICAgJ0EnOiBbCiAgICAgICAgWzAsMSwxLDEsMF0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMSwxLDEsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0KICAgIF0sCiAgICAnQic6IFsKICAgICAgICBbMSwxLDEsMSwwXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwxLDEsMSwwXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwxLDEsMSwwXQogICAgXSwKICAgICdDJzogWwogICAgICAgIFswLDEsMSwxLDFdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFswLDEsMSwxLDFdCiAgICBdLAogICAgJ0QnOiBbCiAgICAgICAgWzEsMSwxLDEsMF0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMSwxLDEsMF0KICAgIF0sCiAgICAnRSc6IFsKICAgICAgICBbMSwxLDEsMSwxXSwKICAgICAgICBbMSwwLDAsMCwwXSwKICAgICAgICBbMSwxLDEsMSwwXSwKICAgICAgICBbMSwwLDAsMCwwXSwKICAgICAgICBbMSwwLDAsMCwwXSwKICAgICAgICBbMSwxLDEsMSwxXQogICAgXSwKICAgICdGJzogWwogICAgICAgIFsxLDEsMSwxLDFdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDEsMSwxLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdCiAgICBdLAogICAgJ0cnOiBbCiAgICAgICAgWzAsMSwxLDEsMV0sCiAgICAgICAgWzEsMCwwLDAsMF0sCiAgICAgICAgWzEsMCwxLDEsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzAsMSwxLDEsMV0KICAgIF0sCiAgICAnSCc6IFsKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwxLDEsMSwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXQogICAgXSwKICAgICdJJzogWwogICAgICAgIFsxLDEsMSwxLDFdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFsxLDEsMSwxLDFdCiAgICBdLAogICAgJ0onOiBbCiAgICAgICAgWzAsMCwxLDEsMV0sCiAgICAgICAgWzAsMCwwLDEsMF0sCiAgICAgICAgWzAsMCwwLDEsMF0sCiAgICAgICAgWzAsMCwwLDEsMF0sCiAgICAgICAgWzEsMCwwLDEsMF0sCiAgICAgICAgWzAsMSwxLDEsMF0KICAgIF0sCiAgICAnSyc6IFsKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMSwwXSwKICAgICAgICBbMSwwLDEsMCwwXSwKICAgICAgICBbMSwxLDAsMCwwXSwKICAgICAgICBbMSwwLDEsMCwwXSwKICAgICAgICBbMSwwLDAsMSwwXQogICAgXSwKICAgICdMJzogWwogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDAsMCwwLDBdLAogICAgICAgIFsxLDEsMSwxLDFdCiAgICBdLAogICAgJ00nOiBbCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMSwwLDEsMV0sCiAgICAgICAgWzEsMCwxLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0KICAgIF0sCiAgICAnTic6IFsKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwxLDAsMCwxXSwKICAgICAgICBbMSwwLDEsMCwxXSwKICAgICAgICBbMSwwLDAsMSwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXQogICAgXSwKICAgICdPJzogWwogICAgICAgIFswLDEsMSwxLDBdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFswLDEsMSwxLDBdCiAgICBdLAogICAgJ1AnOiBbCiAgICAgICAgWzEsMSwxLDEsMF0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMSwxLDEsMF0sCiAgICAgICAgWzEsMCwwLDAsMF0sCiAgICAgICAgWzEsMCwwLDAsMF0KICAgIF0sCiAgICAnUSc6IFsKICAgICAgICBbMCwxLDEsMSwwXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDEsMCwxXSwKICAgICAgICBbMSwwLDAsMSwxXSwKICAgICAgICBbMCwxLDEsMSwxXQogICAgXSwKICAgICdSJzogWwogICAgICAgIFsxLDEsMSwxLDBdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDEsMSwxLDBdLAogICAgICAgIFsxLDAsMSwwLDBdLAogICAgICAgIFsxLDAsMCwxLDBdLAogICAgICAgIFsxLDAsMCwwLDFdCiAgICBdLAogICAgJ1MnOiBbCiAgICAgICAgWzAsMSwxLDEsMV0sCiAgICAgICAgWzEsMCwwLDAsMF0sCiAgICAgICAgWzAsMSwxLDEsMF0sCiAgICAgICAgWzAsMCwwLDAsMV0sCiAgICAgICAgWzAsMCwwLDAsMV0sCiAgICAgICAgWzEsMSwxLDEsMF0KICAgIF0sCiAgICAnVCc6IFsKICAgICAgICBbMSwxLDEsMSwxXSwKICAgICAgICBbMCwwLDEsMCwwXSwKICAgICAgICBbMCwwLDEsMCwwXSwKICAgICAgICBbMCwwLDEsMCwwXSwKICAgICAgICBbMCwwLDEsMCwwXSwKICAgICAgICBbMCwwLDEsMCwwXQogICAgXSwKICAgICdVJzogWwogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFswLDEsMSwxLDBdCiAgICBdLAogICAgJ1YnOiBbCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzAsMSwwLDEsMF0sCiAgICAgICAgWzAsMCwxLDAsMF0KICAgIF0sCiAgICAnVyc6IFsKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDAsMCwxXSwKICAgICAgICBbMSwwLDEsMCwxXSwKICAgICAgICBbMSwxLDAsMSwxXSwKICAgICAgICBbMSwwLDAsMCwxXQogICAgXSwKICAgICdYJzogWwogICAgICAgIFsxLDAsMCwwLDFdLAogICAgICAgIFswLDEsMCwxLDBdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFswLDAsMSwwLDBdLAogICAgICAgIFswLDEsMCwxLDBdLAogICAgICAgIFsxLDAsMCwwLDFdCiAgICBdLAogICAgJ1knOiBbCiAgICAgICAgWzEsMCwwLDAsMV0sCiAgICAgICAgWzAsMSwwLDEsMF0sCiAgICAgICAgWzAsMCwxLDAsMF0sCiAgICAgICAgWzAsMCwxLDAsMF0sCiAgICAgICAgWzAsMCwxLDAsMF0sCiAgICAgICAgWzAsMCwxLDAsMF0KICAgIF0sCiAgICAnWic6IFsKICAgICAgICBbMSwxLDEsMSwxXSwKICAgICAgICBbMCwwLDAsMSwwXSwKICAgICAgICBbMCwwLDEsMCwwXSwKICAgICAgICBbMCwxLDAsMCwwXSwKICAgICAgICBbMSwwLDAsMCwwXSwKICAgICAgICBbMSwxLDEsMSwxXQogICAgXQp9CgojIFV0aWxpdHkgZnVuY3Rpb25zCmRlZiBzaG93X2xldHRlcihtYXRyaXgsIGxldHRlciwgY29sb3I9KDUwLCAwLCAwKSwgZHVyYXRpb249Myk6CiAgICAiIiJTaG93IGEgc2luZ2xlIGxldHRlciIiIgogICAgbGV0dGVyID0gbGV0dGVyLnVwcGVyKCkKICAgIGlmIGxldHRlciBpbiBMRVRURVJfUEFUVEVSTlM6CiAgICAgICAgcHJpbnQoZiJTaG93aW5nIGxldHRlcjoge2xldHRlcn0iKQogICAgICAgIG1hdHJpeC5kaXNwbGF5X3BhdHRlcm4oTEVUVEVSX1BBVFRFUk5TW2xldHRlcl0sIGNvbG9yLCBkdXJhdGlvbikKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoZiJMZXR0ZXIgJ3tsZXR0ZXJ9JyBub3QgZm91bmQgaW4gcGF0dGVybnMiKQoKZGVmIHNob3dfd29yZChtYXRyaXgsIHdvcmQsIGNvbG9yPSg1MCwgMCwgMCksIGxldHRlcl9kdXJhdGlvbj0xLjUsIGdhcF9kdXJhdGlvbj0wLjUpOgogICAgIiIiRGlzcGxheSBhIHdvcmQgbGV0dGVyIGJ5IGxldHRlciIiIgogICAgcHJpbnQoZiJTaG93aW5nIHdvcmQ6IHt3b3JkfSIpCiAgICBmb3IgbGV0dGVyIGluIHdvcmQudXBwZXIoKToKICAgICAgICBpZiBsZXR0ZXIgaW4gTEVUVEVSX1BBVFRFUk5TOgogICAgICAgICAgICBtYXRyaXguZGlzcGxheV9wYXR0ZXJuKExFVFRFUl9QQVRURVJOU1tsZXR0ZXJdLCBjb2xvciwgbGV0dGVyX2R1cmF0aW9uKQogICAgICAgICAgICB0aW1lLnNsZWVwKGdhcF9kdXJhdGlvbikKICAgICAgICBlbGlmIGxldHRlciA9PSAnICc6CiAgICAgICAgICAgIG1hdHJpeC5jbGVhcl9tYXRyaXgoKQogICAgICAgICAgICB0aW1lLnNsZWVwKGdhcF9kdXJhdGlvbiAqIDIpCgpkZWYgZGVtb19hbHBoYWJldChtYXRyaXgsIGNvbG9yPSg1MCwgMCwgMCkpOgogICAgIiIiRGVtbyBzaG93aW5nIGFsbCBsZXR0ZXJzIiIiCiAgICBwcmludCgiU3RhcnRpbmcgYWxwaGFiZXQgZGVtby4uLiIpCiAgICBmb3IgbGV0dGVyIGluICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic6CiAgICAgICAgcHJpbnQoZiJTaG93aW5nOiB7bGV0dGVyfSIpCiAgICAgICAgbWF0cml4LmRpc3BsYXlfcGF0dGVybihMRVRURVJfUEFUVEVSTlNbbGV0dGVyXSwgY29sb3IsIGR1cmF0aW9uPTEpCiAgICAgICAgdGltZS5zbGVlcCgwLjUpCgpkZWYgc2Nyb2xsX3RleHQobWF0cml4LCB0ZXh0LCBjb2xvcj0oNTAsIDAsIDApLCBzcGVlZD0wLjA1LCBsZXR0ZXJfc3BhY2luZz0xKToKICAgICIiIgogICAgQW5pbWF0ZSB0ZXh0IHNjcm9sbGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQgd2l0aCBzbW9vdGggZmxvdyBtb3Rpb24KICAgIHRleHQ6IHN0cmluZyB0byBkaXNwbGF5CiAgICBjb2xvcjogUkdCIGNvbG9yIHR1cGxlCiAgICBzcGVlZDogZGVsYXkgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzIChzbWFsbGVyID0gZmFzdGVyKQogICAgbGV0dGVyX3NwYWNpbmc6IHBpeGVscyBiZXR3ZWVuIGxldHRlcnMKICAgICIiIgogICAgdGV4dCA9IHRleHQudXBwZXIoKQogICAgCiAgICAjIENhbGN1bGF0ZSB0b3RhbCB3aWR0aCBuZWVkZWQgZm9yIGFsbCBsZXR0ZXJzCiAgICBsZXR0ZXJfd2lkdGggPSA1ICAjIEVhY2ggbGV0dGVyIGlzIG5vdyA1IHBpeGVscyB3aWRlCiAgICB0b3RhbF93aWR0aCA9IGxlbih0ZXh0KSAqIChsZXR0ZXJfd2lkdGggKyBsZXR0ZXJfc3BhY2luZykgLSBsZXR0ZXJfc3BhY2luZwogICAgCiAgICAjIFN0YXJ0IHBvc2l0aW9uIChsZXR0ZXJzIHN0YXJ0IG9mZi1zY3JlZW4gdG8gdGhlIHJpZ2h0KQogICAgc3RhcnRfeCA9IENPTFMKICAgIGVuZF94ID0gLXRvdGFsX3dpZHRoCiAgICAKICAgIHByaW50KGYiU2Nyb2xsaW5nIHRleHQ6IHt0ZXh0fSIpCiAgICAKICAgICMgQ3JlYXRlIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSBjdXJyZW50IGZyYW1lCiAgICBmcmFtZV9idWZmZXIgPSBbWzAgZm9yIF8gaW4gcmFuZ2UoQ09MUyldIGZvciBfIGluIHJhbmdlKFJPV1MpXQogICAgCiAgICB0cnk6CiAgICAgICAgIyBBbmltYXRlIGZyb20gcmlnaHQgdG8gbGVmdCB3aXRoIGZyYWN0aW9uYWwgcG9zaXRpb25zIGZvciBzbW9vdGhlciBtb3Rpb24KICAgICAgICBwb3NpdGlvbiA9IGZsb2F0KHN0YXJ0X3gpCiAgICAgICAgCiAgICAgICAgd2hpbGUgcG9zaXRpb24gPiBlbmRfeDoKICAgICAgICAgICAgIyBDbGVhciB0aGUgZnJhbWUgYnVmZmVyCiAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKFJPV1MpOgogICAgICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoQ09MUyk6CiAgICAgICAgICAgICAgICAgICAgZnJhbWVfYnVmZmVyW3ldW3hdID0gMAogICAgICAgICAgICAKICAgICAgICAgICAgIyBEcmF3IGVhY2ggbGV0dGVyIGF0IGl0cyBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgICAgIGN1cnJlbnRfeCA9IHBvc2l0aW9uCiAgICAgICAgICAgIGZvciBjaGFyIGluIHRleHQ6CiAgICAgICAgICAgICAgICBpZiBjaGFyIGluIExFVFRFUl9QQVRURVJOUyBhbmQgY2hhciAhPSAnICc6CiAgICAgICAgICAgICAgICAgICAgZHJhd19sZXR0ZXJfdG9fYnVmZmVyKGZyYW1lX2J1ZmZlciwgY2hhciwgaW50KGN1cnJlbnRfeCksIDAsIGNvbG9yKQogICAgICAgICAgICAgICAgZWxpZiBjaGFyID09ICcgJzoKICAgICAgICAgICAgICAgICAgICBwYXNzICAjIEp1c3Qgc2tpcCBzcGFjZSwgY3JlYXRlcyBnYXAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY3VycmVudF94ICs9IGxldHRlcl93aWR0aCArIGxldHRlcl9zcGFjaW5nCiAgICAgICAgICAgIAogICAgICAgICAgICAjIFVwZGF0ZSBvbmx5IGNoYW5nZWQgcGl4ZWxzCiAgICAgICAgICAgIHVwZGF0ZV9tYXRyaXhfZnJvbV9idWZmZXIobWF0cml4LCBmcmFtZV9idWZmZXIpCiAgICAgICAgICAgIAogICAgICAgICAgICAjIE1vdmUgcG9zaXRpb24gc21vb3RobHkKICAgICAgICAgICAgcG9zaXRpb24gLT0gMS4wICAjIE1vdmUgYnkgMSBwaXhlbCBlYWNoIGZyYW1lCiAgICAgICAgICAgIHRpbWUuc2xlZXAoc3BlZWQpCiAgICAgICAgICAgIAogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHByaW50KCJcbkFuaW1hdGlvbiBzdG9wcGVkIGJ5IHVzZXIiKQogICAgICAgIG1hdHJpeC5jbGVhcl9tYXRyaXgoKQoKZGVmIGRyYXdfbGV0dGVyX3RvX2J1ZmZlcihidWZmZXIsIGxldHRlciwgc3RhcnRfeCwgc3RhcnRfeSwgY29sb3IpOgogICAgIiIiCiAgICBEcmF3IGEgbGV0dGVyIHRvIHRoZSBmcmFtZSBidWZmZXIKICAgICIiIgogICAgaWYgbGV0dGVyIG5vdCBpbiBMRVRURVJfUEFUVEVSTlM6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIHBhdHRlcm4gPSBMRVRURVJfUEFUVEVSTlNbbGV0dGVyXQogICAgCiAgICBmb3Igcm93X2lkeCwgcm93X3BhdHRlcm4gaW4gZW51bWVyYXRlKHBhdHRlcm4pOgogICAgICAgIGZvciBjb2xfaWR4LCBwaXhlbCBpbiBlbnVtZXJhdGUocm93X3BhdHRlcm4pOgogICAgICAgICAgICBpZiBwaXhlbCA9PSAxOgogICAgICAgICAgICAgICAgc2NyZWVuX3ggPSBzdGFydF94ICsgY29sX2lkeAogICAgICAgICAgICAgICAgc2NyZWVuX3kgPSBzdGFydF95ICsgcm93X2lkeAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAjIE9ubHkgZHJhdyBpZiB0aGUgcGl4ZWwgaXMgd2l0aGluIHNjcmVlbiBib3VuZHMKICAgICAgICAgICAgICAgIGlmIDAgPD0gc2NyZWVuX3ggPCBDT0xTIGFuZCAwIDw9IHNjcmVlbl95IDwgUk9XUzoKICAgICAgICAgICAgICAgICAgICBidWZmZXJbc2NyZWVuX3ldW3NjcmVlbl94XSA9IGNvbG9yCgpkZWYgdXBkYXRlX21hdHJpeF9mcm9tX2J1ZmZlcihtYXRyaXgsIGJ1ZmZlcik6CiAgICAiIiIKICAgIFVwZGF0ZSB0aGUgTEVEIG1hdHJpeCBmcm9tIHRoZSBmcmFtZSBidWZmZXIKICAgICIiIgogICAgZm9yIHkgaW4gcmFuZ2UoUk9XUyk6CiAgICAgICAgZm9yIHggaW4gcmFuZ2UoQ09MUyk6CiAgICAgICAgICAgIGlmIGJ1ZmZlclt5XVt4XSAhPSAwOgogICAgICAgICAgICAgICAgbWF0cml4LnNldF9waXhlbCh4LCB5LCBidWZmZXJbeV1beF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtYXRyaXguc2V0X3BpeGVsKHgsIHksICgwLCAwLCAwKSkgICMgVHVybiBvZmYgcGl4ZWwKICAgIAogICAgbWF0cml4Lm5wLndyaXRlKCkKCmRlZiBzY3JvbGxfdGV4dF9jb250aW51b3VzKG1hdHJpeCwgdGV4dCwgY29sb3I9KDUwLCAwLCAwKSwgc3BlZWQ9MC4wNSwgbGV0dGVyX3NwYWNpbmc9MSk6CiAgICAiIiIKICAgIENvbnRpbnVvdXNseSBzY3JvbGwgdGV4dCBpbiBhIGxvb3Agd2l0aCBzbW9vdGggbW90aW9uCiAgICAiIiIKICAgIHByaW50KGYiQ29udGludW91c2x5IHNjcm9sbGluZzoge3RleHR9IikKICAgIHRyeToKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBzY3JvbGxfdGV4dChtYXRyaXgsIHRleHQsIGNvbG9yLCBzcGVlZCwgbGV0dGVyX3NwYWNpbmcpCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4yKSAgIyBCcmllZiBwYXVzZSBiZXR3ZWVuIGxvb3BzCiAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgcHJpbnQoIlxuQ29udGludW91cyBzY3JvbGxpbmcgc3RvcHBlZCIpCiAgICAgICAgbWF0cml4LmNsZWFyX21hdHJpeCgpCgoKZGVmIHNtb290aF9mYWRlX3Njcm9sbChtYXRyaXgsIHRleHQsIGNvbG9yPSg1MCwgMCwgMCksIHNwZWVkPTAuMDMsIGxldHRlcl9zcGFjaW5nPTEpOgogICAgIiIiCiAgICBVbHRyYS1zbW9vdGggc2Nyb2xsaW5nIHdpdGggZmFkZSBlZmZlY3RzIGZvciBldmVuIHNtb290aGVyIG1vdGlvbgogICAgIiIiCiAgICB0ZXh0ID0gdGV4dC51cHBlcigpCiAgICAKICAgIGxldHRlcl93aWR0aCA9IDUKICAgIHRvdGFsX3dpZHRoID0gbGVuKHRleHQpICogKGxldHRlcl93aWR0aCArIGxldHRlcl9zcGFjaW5nKSAtIGxldHRlcl9zcGFjaW5nCiAgICBzdGFydF94ID0gQ09MUwogICAgZW5kX3ggPSAtdG90YWxfd2lkdGgKICAgIAogICAgcHJpbnQoZiJTbW9vdGggZmFkZSBzY3JvbGxpbmc6IHt0ZXh0fSIpCiAgICAKICAgIGZyYW1lX2J1ZmZlciA9IFtbMCBmb3IgXyBpbiByYW5nZShDT0xTKV0gZm9yIF8gaW4gcmFuZ2UoUk9XUyldCiAgICAKICAgIHRyeToKICAgICAgICBwb3NpdGlvbiA9IGZsb2F0KHN0YXJ0X3gpCiAgICAgICAgCiAgICAgICAgd2hpbGUgcG9zaXRpb24gPiBlbmRfeDoKICAgICAgICAgICAgIyBDbGVhciB0aGUgZnJhbWUgYnVmZmVyCiAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKFJPV1MpOgogICAgICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoQ09MUyk6CiAgICAgICAgICAgICAgICAgICAgZnJhbWVfYnVmZmVyW3ldW3hdID0gMAogICAgICAgICAgICAKICAgICAgICAgICAgY3VycmVudF94ID0gcG9zaXRpb24KICAgICAgICAgICAgZm9yIGNoYXIgaW4gdGV4dDoKICAgICAgICAgICAgICAgIGlmIGNoYXIgaW4gTEVUVEVSX1BBVFRFUk5TIGFuZCBjaGFyICE9ICcgJzoKICAgICAgICAgICAgICAgICAgICBkcmF3X2xldHRlcl90b19idWZmZXIoZnJhbWVfYnVmZmVyLCBjaGFyLCBpbnQoY3VycmVudF94KSwgMCwgY29sb3IpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGN1cnJlbnRfeCArPSBsZXR0ZXJfd2lkdGggKyBsZXR0ZXJfc3BhY2luZwogICAgICAgICAgICAKICAgICAgICAgICAgIyBVcGRhdGUgbWF0cml4IGZyb20gYnVmZmVyCiAgICAgICAgICAgIHVwZGF0ZV9tYXRyaXhfZnJvbV9idWZmZXIobWF0cml4LCBmcmFtZV9idWZmZXIpCiAgICAgICAgICAgIAogICAgICAgICAgICBwb3NpdGlvbiAtPSAwLjUgICMgTW92ZSBieSBoYWxmIHBpeGVsIGZvciBldmVuIHNtb290aGVyIG1vdGlvbgogICAgICAgICAgICB0aW1lLnNsZWVwKHNwZWVkKQogICAgICAgICAgICAKICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICBwcmludCgiXG5TbW9vdGggYW5pbWF0aW9uIHN0b3BwZWQiKQogICAgICAgIG1hdHJpeC5jbGVhcl9tYXRyaXgoKQoKIyBNYWluIGV4ZWN1dGlvbgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBJbml0aWFsaXplIHRoZSBOZW9QaXhlbCBtYXRyaXggdXNpbmcgeW91ciBleGlzdGluZyBzZXR1cAogICAgbWF0cml4ID0gTmVvUGl4ZWxNYXRyaXgobnAsIENPTFMsIFJPV1MpCiAgICBwcmludCgiTmVvUGl4ZWwgTEVEIE1hdHJpeCBpbml0aWFsaXplZCEiKQogICAgCiAgICB0cnk6CiAgICAgICAgIyBTQ1JPTExJTkcgVEVYVCBBTklNQVRJT05TOgogICAgICAgIAogICAgICAgICMgRXhhbXBsZSAxOiBCYXNpYyAidHNjaXJjdWl0IiBzY3JvbGwgd2l0aCBzbW9vdGggbW90aW9uCiAgICAgICAgIyBzY3JvbGxfdGV4dChtYXRyaXgsICJ0c2NpcmN1aXQiLCBjb2xvcj0oMCwgMCwgNTApLCBzcGVlZD0wLjA1KQogICAgICAgIAogICAgICAgICMgRXhhbXBsZSAyOiBVbHRyYS1zbW9vdGggZmFkZSBzY3JvbGxpbmcgKGV2ZW4gc21vb3RoZXIpCiAgICAgICAgIyBzbW9vdGhfZmFkZV9zY3JvbGwobWF0cml4LCAidHNjaXJjdWl0IiwgY29sb3I9KDUwLCAwLCAwKSwgc3BlZWQ9MC4wMykKICAgICAgICAKICAgICAgICAjIEV4YW1wbGUgMzogU2hvdyBtdWx0aXBsZSBsZXR0ZXJzIGRlbW8gZmlyc3QKICAgICAgICAjIHNob3dfbXVsdGlwbGVfbGV0dGVyc19kZW1vKG1hdHJpeCkKICAgICAgICAKICAgICAgICAjIEV4YW1wbGUgNDogRmFzdCBzbW9vdGggc2Nyb2xsIGluIGdyZWVuCiAgICAgICAgIyBzY3JvbGxfdGV4dChtYXRyaXgsICJ0c2NpcmN1aXQiLCBjb2xvcj0oMCwgNTAsIDApLCBzcGVlZD0wLjAzKQogICAgICAgIAogICAgICAgICMgRXhhbXBsZSA1OiBSYWluYm93IGNvbG9yZWQgbGV0dGVycyB3aXRoIHNtb290aCBtb3Rpb24KICAgICAgICAjIHJhaW5ib3dfc2Nyb2xsX3RleHQobWF0cml4LCAidHNjaXJjdWl0Iiwgc3BlZWQ9MC4wNSkKICAgICAgICAKICAgICAgICAjIEV4YW1wbGUgNjogQ29udGludW91cyBzbW9vdGggbG9vcAogICAgICAgIHNjcm9sbF90ZXh0X2NvbnRpbnVvdXMobWF0cml4LCAidHNjaXJjdWl0IiwgY29sb3I9KDAsIDAsIDUwKSwgc3BlZWQ9MC4wNSkKICAgICAgICAKICAgICAgICAjIEV4YW1wbGUgNTogRGlmZmVyZW50IHRleHQKICAgICAgICAjIHNjcm9sbF90ZXh0KG1hdHJpeCwgImhlbGxvIHdvcmxkIiwgY29sb3I9KDUwLCAyNSwgMCksIHNwZWVkPTAuMSkKICAgICAgICAKICAgICAgICAjIFNUQVRJQyBMRVRURVIgRVhBTVBMRVM6CiAgICAgICAgIyBzaG93X2xldHRlcihtYXRyaXgsICdBJywgY29sb3I9KDUwLCAwLCAwKSwgZHVyYXRpb249NSkKICAgICAgICAjIHNob3dfd29yZChtYXRyaXgsICJIRUxMTyIsIGNvbG9yPSgwLCA1MCwgMCksIGxldHRlcl9kdXJhdGlvbj0yKQogICAgICAgICMgZGVtb19hbHBoYWJldChtYXRyaXgsIGNvbG9yPSg1MCwgMCwgMCkpCiAgICAgICAgICAgIAogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHByaW50KCJcblN0b3BwaW5nLi4uIikKICAgIGZpbmFsbHk6CiAgICAgICAgbWF0cml4LmNsZWFyX21hdHJpeCgpCiAgICAgICAgcHJpbnQoIk1hdHJpeCBjbGVhcmVkLiIpCg==