Skip to contentLy8gPGJsb2NrOnNldHVwOjM+CmNvbnN0IEdST1VQUyA9IFsncmVnaW9uJ107CgpmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyaW5nKSB7CiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTsKfQovLyA8L2Jsb2NrOnNldHVwPgoKLy8gPGJsb2NrOm9wdGlvbnM6Mj4KY29uc3Qgb3B0aW9ucyA9IHsKICBwbHVnaW5zOiB7CiAgICB0aXRsZTogewogICAgICBkaXNwbGF5OiB0cnVlLAogICAgICB0ZXh0OiAoY3R4KSA9PiAnVVMgYXJlYSBieSAnICsgR1JPVVBTLmpvaW4oJyAvICcpCiAgICB9LAogICAgbGVnZW5kOiB7CiAgICAgIGRpc3BsYXk6IGZhbHNlCiAgICB9LAogICAgdG9vbHRpcDogewogICAgICBjYWxsYmFja3M6IHsKICAgICAgICB0aXRsZShpdGVtcykgewogICAgICAgICAgcmV0dXJuIGNhcGl0YWxpemVGaXJzdExldHRlcihpdGVtc1swXS5kYXRhc2V0LmtleSk7CiAgICAgICAgfSwKICAgICAgICBsYWJlbChpdGVtKSB7CiAgICAgICAgICBjb25zdCBkYXRhSXRlbSA9IGl0ZW0ucmF3OwogICAgICAgICAgY29uc3Qgb2JqID0gZGF0YUl0ZW0uX2RhdGE7CiAgICAgICAgICBjb25zdCBsYWJlbCA9IG9iai5zdGF0ZSB8fCBvYmouZGl2aXNpb24gfHwgb2JqLnJlZ2lvbjsKICAgICAgICAgIHJldHVybiBsYWJlbCArICc6ICcgKyBkYXRhSXRlbS52OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKLy8gPC9ibG9jazpvcHRpb25zPgoKLy8gPGJsb2NrOmNvbmZpZzowPgpjb25zdCBjb25maWcgPSB7CiAgdHlwZTogJ3RyZWVtYXAnLAogIGRhdGE6IHsKICAgIGRhdGFzZXRzOiBbewogICAgICB0cmVlOiBEYXRhLnN0YXRzQnlTdGF0ZSwKICAgICAga2V5OiAnYXJlYScsCiAgICAgIGdyb3VwczogR1JPVVBTLAogICAgICBzcGFjaW5nOiAxLAogICAgICBib3JkZXJXaWR0aDogMC41LAogICAgICBib3JkZXJDb2xvcjogJ3JnYmEoMjAwLDIwMCwyMDAsMSknLAogICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDIyMCwyMzAsMjIwLDAuMyknLAogICAgICBob3ZlckJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjIwLDIzMCwyMjAsMC41KScsCiAgICB9XQogIH0sCiAgb3B0aW9uczogb3B0aW9ucwp9OwoKLy8gPC9ibG9jazpjb25maWc+CmZ1bmN0aW9uIHRvZ2dsZShjaGFydCwgZ3JvdXApIHsKICBjb25zdCBpZHggPSBHUk9VUFMuaW5kZXhPZihncm91cCk7CiAgaWYgKGlkeCA9PT0gLTEpIHsKICAgIEdST1VQUy5wdXNoKGdyb3VwKTsKICB9IGVsc2UgewogICAgR1JPVVBTLnNwbGljZShpZHgsIDEpOwogIH0KICBjaGFydC51cGRhdGUoKTsKfQoKY29uc3QgYWN0aW9ucyA9IFsKICB7CiAgICBuYW1lOiAnVG9nZ2xlIFJlZ2lvbicsCiAgICBoYW5kbGVyOiAoY2hhcnQpID0+IHRvZ2dsZShjaGFydCwgJ3JlZ2lvbicpCiAgfSwKICB7CiAgICBuYW1lOiAnVG9nZ2xlIERpdmlzaW9uJywKICAgIGhhbmRsZXI6IChjaGFydCkgPT4gdG9nZ2xlKGNoYXJ0LCAnZGl2aXNpb24nKQogIH0sCiAgewogICAgbmFtZTogJ1RvZ2dsZSBTdGF0ZScsCiAgICBoYW5kbGVyOiAoY2hhcnQpID0+IHRvZ2dsZShjaGFydCwgJ3N0YXRlJykKICB9LApdOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgYWN0aW9ucywKICBjb25maWcsCn07