data:text/html;charset=UTF-8;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCIvPgo8dGl0bGU+TWlsa3kgV2F5IEdhbGF4eSB3aXRoIFNvbGFyIFN5c3RlbTwvdGl0bGU+CjwhLS0gSW5jbHVkZSBUaHJlZS5qcyAtLT4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xNTIuMi9idWlsZC90aHJlZS5taW4uanMiPjwvc2NyaXB0Pgo8IS0tIEluY2x1ZGUgT3JiaXRDb250cm9scyAtLT4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vdGhyZWVAMC4xNTIuMi9leGFtcGxlcy9qcy9jb250cm9scy9PcmJpdENvbnRyb2xzLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7IG92ZXJmbG93OmhpZGRlbjsiPgo8IS0tIENhbnZhcyB3aWxsIGJlIGFkZGVkIGJ5IFRocmVlLmpzIC0tPgo8c2NyaXB0PgovLyBTY2VuZSwgQ2FtZXJhLCBSZW5kZXJlcgpjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpOwpzY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKDB4MDAwMDAwKTsKCmNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgKICA0NSwKICB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodCwKICAwLjEsCiAgMjAwMAopOwpjYW1lcmEucG9zaXRpb24uc2V0KDAsIDEwMCwgMjAwKTsKCmNvbnN0IHJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBhbnRpYWxpYXM6dHJ1ZSB9KTsKcmVuZGVyZXIuc2V0U2l6ZSh3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KTsKCi8vIEFkZCBPcmJpdENvbnRyb2xzIGZvciBjYW1lcmEgaW50ZXJhY3Rpb24KY29uc3QgY29udHJvbHMgPSBuZXcgVEhSRUUuT3JiaXRDb250cm9scyhjYW1lcmEsIHJlbmRlcmVyLmRvbUVsZW1lbnQpOwpjb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTsKY29udHJvbHMuZGFtcGluZ0ZhY3RvciA9IDAuMDU7CgovLyBMaWdodGluZwpjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjQpOwpzY2VuZS5hZGQoYW1iaWVudExpZ2h0KTsKCmNvbnN0IHBvaW50TGlnaHQgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmZmZmZiwgMS41KTsKcG9pbnRMaWdodC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7IC8vIFN1biBhcyBsaWdodCBzb3VyY2UKc2NlbmUuYWRkKHBvaW50TGlnaHQpOwoKLy8gU3VuCmNvbnN0IHN1bkdlb21ldHJ5ID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDEwLCAzMiwgMzIpOwpjb25zdCBzdW5NYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAweGZmZmYwMCB9KTsKY29uc3Qgc3VuID0gbmV3IFRIUkVFLk1lc2goc3VuR2VvbWV0cnksIHN1bk1hdGVyaWFsKTsKc2NlbmUuYWRkKHN1bik7CgovLyBQbGFuZXRzIGRhdGE6IG5hbWUsIGRpc3RhbmNlIGZyb20gc3VuLCBzaXplLCBjb2xvciwgb3JiaXRhbCBwZXJpb2QgKHNpbXBsaWZpZWQpCmNvbnN0IHBsYW5ldHNEYXRhID0gWwogIHsgbmFtZTogJ01lcmN1cnknLCBkaXN0YW5jZTogMTUsIHNpemU6IDEsIGNvbG9yOiAweGFhYWFhYSwgcGVyaW9kOiA4OCB9LAogIHsgbmFtZTogJ1ZlbnVzJywgZGlzdGFuY2U6IDIwLCBzaXplOiAxLjIsIGNvbG9yOiAweGZmY2M5OSwgcGVyaW9kOiAyMjUgfSwKICB7IG5hbWU6ICdFYXJ0aCcsIGRpc3RhbmNlOiAyNSwgc2l6ZTogMS4zLCBjb2xvcjogMHgyMjMzZmYsIHBlcmlvZDogMzY1IH0sCiAgeyBuYW1lOiAnTWFycycsIGRpc3RhbmNlOiAzMCwgc2l6ZTogMS4xLCBjb2xvcjogMHhmZjAwMDAsIHBlcmlvZDogNjg3IH0sCiAgeyBuYW1lOiAnSnVwaXRlcicsIGRpc3RhbmNlOiA0MCwgc2l6ZTogMi41LCBjb2xvcjogMHhmZmFhNjYsIHBlcmlvZDogNDMzMyB9LAogIHsgbmFtZTogJ1NhdHVybicsIGRpc3RhbmNlOiA1MCwgc2l6ZTogMi4yLCBjb2xvcjogMHhmZmRkODgsIHBlcmlvZDogMTA3NTkgfSwKICB7IG5hbWU6ICdVcmFudXMnLCBkaXN0YW5jZTogNjAsIHNpemU6IDEuOCwgY29sb3I6IDB4NjZjY2ZmLCBwZXJpb2Q6IDMwNjg3IH0sCiAgeyBuYW1lOiAnTmVwdHVuZScsIGRpc3RhbmNlOiA3MCwgc2l6ZTogMS43LCBjb2xvcjogMHgwMDAwZmYsIHBlcmlvZDogNjAxOTAgfSwKICB7IG5hbWU6ICdQbHV0bycsIGRpc3RhbmNlOiA4MCwgc2l6ZTogMC44LCBjb2xvcjogMHhmZmZmZmYsIHBlcmlvZDogOTA1NjAgfQpdOwoKLy8gQ3JlYXRlIHBsYW5ldHMgYW5kIG9yYml0YWwgcGF0aHMKY29uc3QgcGxhbmV0cyA9IFtdOwpjb25zdCBvcmJpdGFsUGF0aHMgPSBbXTsKCnBsYW5ldHNEYXRhLmZvckVhY2goZGF0YSA9PiB7CiAgLy8gUGxhbmV0IG1lc2gKICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShkYXRhLnNpemUsIDMyLCAzMik7CiAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBjb2xvcjogZGF0YS5jb2xvciB9KTsKICBjb25zdCBwbGFuZXRNZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAKICAvLyBQb3NpdGlvbiB0aGUgcGxhbmV0IGF0IGluaXRpYWwgcG9zaXRpb24KICBwbGFuZXRNZXNoLnBvc2l0aW9uLnggPSBkYXRhLmRpc3RhbmNlOwogIAogIHNjZW5lLmFkZChwbGFuZXRNZXNoKTsKICAKICAvLyBTdG9yZSBvcmJpdCBpbmZvCiAgcGxhbmV0cy5wdXNoKHsKICAgIG1lc2g6IHBsYW5ldE1lc2gsCiAgICBhbmdsZTogTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyLCAvLyByYW5kb20gc3RhcnQgcG9zaXRpb24KICAgIGRpc3RhbmNlOiBkYXRhLmRpc3RhbmNlLAogICAgcGVyaW9kOiBkYXRhLnBlcmlvZCAvLyBpbiBkYXlzCiAgfSk7CiAgCiAgLy8gT3B0aW9uYWw6IGFkZCBvcmJpdGFsIHBhdGggdmlzdWFsaXphdGlvbgogIGNvbnN0IG9yYml0R2VvbWV0cnkgPSBuZXcgVEhSRUUuUmluZ0dlb21ldHJ5KGRhdGEuZGlzdGFuY2UgLSAwLjA1LCBkYXRhLmRpc3RhbmNlICsgMC4wNSwgNjQpOwogIGNvbnN0IG9yYml0TWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoeyBjb2xvcjogMHhmZmZmZmYsIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGUgfSk7CiAgY29uc3Qgb3JiaXQgPSBuZXcgVEhSRUUuTWVzaChvcmJpdEdlb21ldHJ5LCBvcmJpdE1hdGVyaWFsKTsKICBvcmJpdC5yb3RhdGlvbi54ID0gTWF0aC5QSSAvIDI7CiAgc2NlbmUuYWRkKG9yYml0KTsKICBvcmJpdGFsUGF0aHMucHVzaChvcmJpdCk7Cn0pOwoKLy8gQW5pbWF0aW9uIGxvb3AKZnVuY3Rpb24gYW5pbWF0ZSgpIHsKICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7CiAgCiAgLy8gVXBkYXRlIHBsYW5ldHMnIHBvc2l0aW9ucwogIHBsYW5ldHMuZm9yRWFjaChwbGFuZXQgPT4gewogICAgLy8gQ2FsY3VsYXRlIGFuZ3VsYXIgc3BlZWQgYmFzZWQgb24gb3JiaXRhbCBwZXJpb2QKICAgIGNvbnN0IGFuZ3VsYXJTcGVlZCA9ICgyICogTWF0aC5QSSkgLyBwbGFuZXQucGVyaW9kOyAvLyByYWRpYW5zIHBlciBkYXkKICAgIHBsYW5ldC5hbmdsZSArPSBhbmd1bGFyU3BlZWQgKiAwLjAxOyAvLyBzY2FsZWQgZm9yIGFuaW1hdGlvbiBzcGVlZAogICAgCiAgICAvLyBVcGRhdGUgcG9zaXRpb24KICAgIHBsYW5ldC5tZXNoLnBvc2l0aW9uLnggPSBNYXRoLmNvcyhwbGFuZXQuYW5nbGUpICogcGxhbmV0LmRpc3RhbmNlOwogICAgcGxhbmV0Lm1lc2gucG9zaXRpb24ueiA9IE1hdGguc2luKHBsYW5ldC5hbmdsZSkgKiBwbGFuZXQuZGlzdGFuY2U7CiAgfSk7CiAgCiAgY29udHJvbHMudXBkYXRlKCk7CiAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpOwp9CgovLyBIYW5kbGUgd2luZG93IHJlc2l6ZQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gewogIGNhbWVyYS5hc3BlY3QgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDsKICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogIHJlbmRlcmVyLnNldFNpemUod2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7Cn0pOwoKLy8gT3B0aW9uYWw6IEFkZCBiYWNrZ3JvdW5kIHNvdW5kCmNvbnN0IGxpc3RlbmVyID0gbmV3IFRIUkVFLkF1ZGlvTGlzdGVuZXIoKTsKY2FtZXJhLmFkZChsaXN0ZW5lcik7CmNvbnN0IHNvdW5kID0gbmV3IFRIUkVFLkF1ZGlvKGxpc3RlbmVyKTsKY29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgVEhSRUUuQXVkaW9Mb2FkZXIoKTsKCi8vIExvYWQgYSBzb3VuZCAoZS5nLiwgYW1iaWVudCBzcGFjZSBzb3VuZCBvciBtdXNpYykKYXVkaW9Mb2FkZXIubG9hZCgnaHR0cHM6Ly9jZG4ucGl4YWJheS5jb20vZG93bmxvYWQvYXVkaW8vMjAyMy8wMy8yNy9hdWRpb184YjRmN2EyYjZiLm1wMycsIGZ1bmN0aW9uKGJ1ZmZlcikgewogIHNvdW5kLnNldEJ1ZmZlcihidWZmZXIpOwogIHNvdW5kLnNldExvb3AodHJ1ZSk7CiAgc291bmQuc2V0Vm9sdW1lKDAuNSk7CiAgc291bmQucGxheSgpOwp9KTsKCi8vIFN0YXJ0IGFuaW1hdGlvbgphbmltYXRlKCk7Cgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+