PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICA8dGl0bGU+U2NpZW50aWZpYyBDYWxjdWxhdG9yPC90aXRsZT4KICA8c3R5bGU+CiAgICAqIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CiAgICBib2R5IHsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1pbi1oZWlnaHQ6IDEwMHZoOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNjY3ZWVhIDAlLCAjNzY0YmEyIDEwMCUpOyBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgVGFob21hLCBHZW5ldmEsIFZlcmRhbmEsIHNhbnMtc2VyaWY7IH0KICAgIC5jYWxjdWxhdG9yIHsgYmFja2dyb3VuZDogIzFjMWMxYzsgYm9yZGVyLXJhZGl1czogMjBweDsgcGFkZGluZzogMjBweDsgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggcmdiYSgwLDAsMCwwLjUpOyB3aWR0aDogMzgwcHg7IH0KICAgIC5kaXNwbGF5IHsgYmFja2dyb3VuZDogIzJhMmEyYTsgYm9yZGVyLXJhZGl1czogMTJweDsgcGFkZGluZzogMjBweDsgbWFyZ2luLWJvdHRvbTogMTVweDsgdGV4dC1hbGlnbjogcmlnaHQ7IG1pbi1oZWlnaHQ6IDEwMHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOyB9CiAgICAjcHJldmlvdXMgeyBjb2xvcjogIzg4ODsgZm9udC1zaXplOiAxLjJyZW07IG1pbi1oZWlnaHQ6IDI0cHg7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQogICAgI2N1cnJlbnQgeyBjb2xvcjogI2ZmZjsgZm9udC1zaXplOiAyLjVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQogICAgLmJ1dHRvbnMgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOyBnYXA6IDEwcHg7IH0KICAgIC5idG4geyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDEycHg7IHBhZGRpbmc6IDE4cHggMTBweDsgZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGN1cnNvcjogcG9pbnRlcjsgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7IGNvbG9yOiAjZmZmOyBvdXRsaW5lOiBub25lOyB9CiAgICAuYnRuOmhvdmVyIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOyBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4zKTsgfQogICAgLmJ0bjphY3RpdmUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KICAgIC5idG4ubnVtYmVyIHsgYmFja2dyb3VuZDogIzNhM2EzYTsgfQogICAgLmJ0bi5udW1iZXI6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNGE0YTRhOyB9CiAgICAuYnRuLm9wZXJhdG9yIHsgYmFja2dyb3VuZDogI2YwOWEzNzsgfQogICAgLmJ0bi5vcGVyYXRvcjpob3ZlciB7IGJhY2tncm91bmQ6ICNmZmIzNDc7IH0KICAgIC5idG4uZnVuY3Rpb24geyBiYWNrZ3JvdW5kOiAjNTU1OyBmb250LXNpemU6IDAuOTVyZW07IH0KICAgIC5idG4uZnVuY3Rpb246aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNjY2OyB9CiAgICAuYnRuLmVxdWFscyB7IGJhY2tncm91bmQ6ICM2NjdlZWE7IGdyaWQtY29sdW1uOiBzcGFuIDI7IH0KICAgIC5idG4uZXF1YWxzOmhvdmVyIHsgYmFja2dyb3VuZDogIzdjOGZmMDsgfQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGRpdiBjbGFzcz0iY2FsY3VsYXRvciI+CiAgICA8ZGl2IGNsYXNzPSJkaXNwbGF5Ij4KICAgICAgPGRpdiBpZD0icHJldmlvdXMiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJjdXJyZW50Ij4wPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiIGlkPSJidXR0b25zIj48L2Rpdj4KICA8L2Rpdj4KICA8c2NyaXB0PgogICAgY29uc3QgYnV0dG9ucyA9IFsKICAgICAgeyBsOiAnQUMnLCB0OiAnZnVuY3Rpb24nLCBhOiAoKSA9PiBjbGVhckFsbCgpIH0sCiAgICAgIHsgbDogJ0RFTCcsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGRlbGV0ZUxhc3QoKSB9LAogICAgICB7IGw6ICclJywgdDogJ2Z1bmN0aW9uJywgYTogKCkgPT4gYXBwZW5kQ2hhcignJScpIH0sCiAgICAgIHsgbDogJ8O3JywgdDogJ29wZXJhdG9yJywgYTogKCkgPT4gYXBwZW5kQ2hhcignLycpIH0sCiAgICAgIHsgbDogJ3NpbicsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZEZ1bmMoJ3NpbicpIH0sCiAgICAgIHsgbDogJ2NvcycsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZEZ1bmMoJ2NvcycpIH0sCiAgICAgIHsgbDogJ3RhbicsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZEZ1bmMoJ3RhbicpIH0sCiAgICAgIHsgbDogJ8+AJywgdDogJ2Z1bmN0aW9uJywgYTogKCkgPT4gYXBwZW5kQ2hhcihTdHJpbmcoTWF0aC5QSSkpIH0sCiAgICAgIHsgbDogJ2xvZycsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZEZ1bmMoJ2xvZycpIH0sCiAgICAgIHsgbDogJ2xuJywgdDogJ2Z1bmN0aW9uJywgYTogKCkgPT4gYXBwZW5kRnVuYygnbG4nKSB9LAogICAgICB7IGw6ICfiiJonLCB0OiAnZnVuY3Rpb24nLCBhOiAoKSA9PiBhcHBlbmRGdW5jKCdzcXJ0JykgfSwKICAgICAgeyBsOiAnZScsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZENoYXIoU3RyaW5nKE1hdGguRSkpIH0sCiAgICAgIHsgbDogJ3jKuCcsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZENoYXIoJ14nKSB9LAogICAgICB7IGw6ICd4IScsIHQ6ICdmdW5jdGlvbicsIGE6ICgpID0+IGFwcGVuZENoYXIoJyEnKSB9LAogICAgICB7IGw6ICcoJywgdDogJ2Z1bmN0aW9uJywgYTogKCkgPT4gYXBwZW5kQ2hhcignKCcpIH0sCiAgICAgIHsgbDogJyknLCB0OiAnZnVuY3Rpb24nLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCcpJykgfSwKICAgICAgeyBsOiAnNycsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc3JykgfSwKICAgICAgeyBsOiAnOCcsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc4JykgfSwKICAgICAgeyBsOiAnOScsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc5JykgfSwKICAgICAgeyBsOiAnw5cnLCB0OiAnb3BlcmF0b3InLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCcqJykgfSwKICAgICAgeyBsOiAnNCcsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc0JykgfSwKICAgICAgeyBsOiAnNScsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc1JykgfSwKICAgICAgeyBsOiAnNicsIHQ6ICdudW1iZXInLCBhOiAoKSA9PiBhcHBlbmRDaGFyKCc2JykgfSwKICAgICAgeyBsOiAnLScsIHQ6ICdvcGVyYXRvcicsIGE6ICgpID0+IGFwcGVuZENoYXIoJy0nKSB9LAogICAgICB7IGw6ICcxJywgdDogJ251bWJlcicsIGE6ICgpID0+IGFwcGVuZENoYXIoJzEnKSB9LAogICAgICB7IGw6ICcyJywgdDogJ251bWJlcicsIGE6ICgpID0+IGFwcGVuZENoYXIoJzInKSB9LAogICAgICB7IGw6ICczJywgdDogJ251bWJlcicsIGE6ICgpID0+IGFwcGVuZENoYXIoJzMnKSB9LAogICAgICB7IGw6ICcrJywgdDogJ29wZXJhdG9yJywgYTogKCkgPT4gYXBwZW5kQ2hhcignKycpIH0sCiAgICAgIHsgbDogJzAnLCB0OiAnbnVtYmVyJywgYTogKCkgPT4gYXBwZW5kQ2hhcignMCcpIH0sCiAgICAgIHsgbDogJy4nLCB0OiAnbnVtYmVyJywgYTogKCkgPT4gYXBwZW5kQ2hhcignLicpIH0sCiAgICAgIHsgbDogJz0nLCB0OiAnZXF1YWxzJywgYTogKCkgPT4gY2FsY3VsYXRlKCkgfQogICAgXTsKICAgIGxldCBjdXJyZW50IDMCwgJzAnLCBwcmV2aW91cyA9ICcnOwogICAgY29uc3QgY3VycmVudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1cnJlbnQnKTsKICAgIGNvbnN0IHByZXZpb3VzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlvdXMnKTsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidXR0b25zJyk7CiAgICBidXR0b25zLmZvckVhY2goYiA9PiB7CiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICBidG4uY2xhc3NOYW1lID0gJ2J0biAnICsgYi50OwogICAgICBidG4udGV4dENvbnRlbnQgPSBiLmw7CiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGIuYSk7CiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChidG4pOwogICAgfSk7CiAgICBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5KCkgewogICAgICBjdXJyZW50RWwudGV4dENvbnRlbnQgPSBjdXJyZW50OwogICAgICBwcmV2aW91c0VsLnRleHRDb250ZW50ID0gcHJldmlvdXM7CiAgICB9CiAgICBmdW5jdGlvbiBhcHBlbmRDaGFyKGMpIHsKICAgICAgaWYgKGN1cnJlbnQgPT09ICcwJyAmJiBjICE9PSAnLicgJiYgYyAhPT0gJygnICYmIGMgIT09ICcrJyAmJiBjICE9PSAnLScgJiYgYyAhPT0gJyonICYmIGMgIT09ICcvJyAmJiBjICE9PSAnXicgJiYgYyAhPT0gJyEnKSB7CiAgICAgICAgY3VycmVudCA9IGM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudCArPSBjOwogICAgICB9CiAgICAgIHVwZGF0ZURpc3BsYXkoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGVuZEZ1bmMobmFtZSkgewogICAgICBjdXJyZW50ICs9IG5hbWUgKyAnKCc7CiAgICAgIHVwZGF0ZURpc3BsYXkoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRlbGV0ZUxhc3QoKSB7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lmxlbmd0aCA+IDEgPyBjdXJyZW50LnNsaWNlKDAsIC0xKSA6ICcwJzsKICAgICAgdXBkYXRlRGlzcGxheSgpOwogICAgfQogICAgZnVuY3Rpb24gY2xlYXJBbGwoKSB7CiAgICAgIGN1cnJlbnQgPSAnMCc7CiAgICAgIHByZXZpb3VzID0gJyc7CiAgICAgIHVwZGF0ZURpc3BsYXkoKTsKICAgIHMCKICAgIGZ1bmN0aW9uIGZhY3RvcmlhbChuKSB7CiAgICAgIGlmIChuIDwgMCB8fCBuICE9PSBNYXRoLmZsb29yKG4pKSByZXR1cm4gTmFOOwogICAgICBsZXQgciA9IDE7CiAgICAgIGZvciAobGV0IGkgPSAyOyBpIDw9IG47IGkrKykgciAqPSBpOwogICAgICByZXR1cm4gcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgdHJ5IHsKICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQgKyAnID0nOwogICAgICAgIGxldCBleHByID0gY3VycmVudDsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC9cXi9nLCAnKionKTsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC9zcXJ0XCgvZywgJ01hdGguc3FydCgnKTsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC9sb2dcKC9nLCAnTWF0aC5sb2cxMCgnKTsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC9sblwoL2csICdNYXRoLmxvZygnKTsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC9zaW5cKC9nLCAnTWF0aC5zaW4oJyk7CiAgICAgICAgZXhwciA9IGV4cHIucmVwbGFjZSgvY29zXCgvZywgJ01hdGguY29zKCcpOwogICAgICAgIGV4cHIgPSBleHByLnJlcGxhY2UoL3RhblwoL2csICdNYXRoLnRhbignKTsKICAgICAgICBleHByID0gZXhwci5yZXBsYWNlKC8oXGQrKD86XC5cZCspPylcIS9nLCAobSwgbikgPT4gU3RyaW5nKGZhY3RvcmlhbChwYXJzZUZsb2F0KG4pKSkpOwogICAgICAgIGV4cHIgPSBleHByLnJlcGxhY2UoLyhcZCsoPzpcLlxkKyk/KSUvZywgKG0sIG4pID0+ICcoJyArIChwYXJzZUZsb2F0KG4pIC8gMTAwKSArICcpJyk7CiAgICAgICAgbGV0IHJlc3VsdCA9IEZ1bmN0aW9uKCdidXNlIHN0cmljdCc7IHJldHVybiAoJyArIGV4cHIgKyAnKScpKCk7CiAgICAgICAgaWYgKGlzTmFOKHJlc3VsdCkgfHwgIWlzRmluaXRlKHJlc3VsdCkpIHsKICAgICAgICAgIGN1cnJlbnQgPSAnRXJyb3InOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQgPSBNYXRoLnJvdW5kKHJlc3VsdCAqIDFlMTApIC8gMWUxMDsKICAgICAgICAgIGN1cnJlbnQgPSBTdHJpbmcocmVzdWx0KTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjdXJyZW50ID0gJ0Vycm9yJzsKICAgICAgfQogICAgICB1cGRhdGVEaXNwbGF5KCk7CiAgICB9CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsKICAgICAgaWYgKC9bMC05XS8udGVzdChlLmtleSkpIGFwcGVuZENoYXIoZS5rZXkpOwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJy4nKSBhcHBlbmRDaGFyKCcuJyk7CiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSAnKycgfHwgZS5rZXkgPT09ICctJyB8fCBlLmtleSA9PT0gJyonIHx8IGUua2V5ID09PSAnLycpIGFwcGVuZENoYXIoZS5rZXkpOwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJz0nKSB7IGUucHJldmVudERlZmF1bHQoKTsgY2FsY3VsYXRlKCk7IH0KICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnKSBkZWxldGVMYXN0KCk7CiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgY2xlYXJBbGwoKTsKICAgIH0pOwogICAgdXBkYXRlRGlzcGxheSgpOwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4=