LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAyMi5sb2NhbGUubW9uZXkuZ2V0LmNwcAogKgogKiAkSWQkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSAgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogKiBjb250cmlidXRvciAgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlICB0aGUgTk9USUNFICBmaWxlIGRpc3RyaWJ1dGVkCiAqIHdpdGggIHRoaXMgIHdvcmsgIGZvciAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgcmVnYXJkaW5nICBjb3B5cmlnaHQKICogb3duZXJzaGlwLiAgIFRoZSBBU0YgIGxpY2Vuc2VzIHRoaXMgIGZpbGUgdG8gIHlvdSB1bmRlciAgdGhlIEFwYWNoZQogKiBMaWNlbnNlLCBWZXJzaW9uICAyLjAgKHRoZSAgIkxpY2Vuc2UiKTsgeW91IG1heSAgbm90IHVzZSAgdGhpcyBmaWxlCiAqIGV4Y2VwdCBpbiAgY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgIFlvdSBtYXkgb2J0YWluICBhIGNvcHkgb2YKICogdGhlIExpY2Vuc2UgYXQKICoKICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgIE9GIEFOWSAgS0lORCwgZWl0aGVyICBleHByZXNzIG9yCiAqIGltcGxpZWQuICAgU2VlICB0aGUgTGljZW5zZSAgZm9yICB0aGUgIHNwZWNpZmljIGxhbmd1YWdlICBnb3Zlcm5pbmcKICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBDb3B5cmlnaHQgMjAwMS0yMDA2IFJvZ3VlIFdhdmUgU29mdHdhcmUuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8aW9zPgojaW5jbHVkZSA8bG9jYWxlPgoKI2luY2x1ZGUgPGNzdGRpbz4gICAgIC8vIGZvciBzc2NhbmYoKQoKI2luY2x1ZGUgPGNtZG9wdC5oPiAgIC8vIGZvciByd19lbmFibGVkKCkKI2luY2x1ZGUgPGRyaXZlci5oPiAgIC8vIGZvciByd19hc3NlcnQoKSwgcndfdGVzdCgpLCAuLi4KI2luY2x1ZGUgPHJ3X2NoYXIuaD4gIC8vIGZvciByd19leHBhbmQoKQojaW5jbHVkZSA8dmFsY21wLmg+ICAgLy8gZm9yIHJ3X2xkYmxjbXAoKQoKCiNpZm5kZWYgX1JXU1REX05PX0xPTkdfRE9VQkxFCiMgIGRlZmluZSBMb25nRG91YmxlIGxvbmcgZG91YmxlCiNlbHNlCiMgIGRlZmluZSBMb25nRG91YmxlICAgZG91YmxlCiMgIGRlZmluZSByd19sZGJsY21wICAgcndfZGJsY21wCiNlbmRpZiAgIC8vIF9SV1NURF9OT19MT05HX0RPVUJMRQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gc2V0IHRvIG5vbi16ZXJvIHZhbHVlIHdoZW4gdGhlIGJhc2ljX3N0cmluZyBvdmVybG9hZHMKLy8gb2YgbW9uZVktcHV0OjpwdXQoKSBzaG91bGRuJ3QgYmUgZXhlcmNpc2VkCnN0YXRpYyBpbnQgbm9fYmFzaWNfc3RyaW5nOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gcmVwbGFjZW1lbnQgY3R5cGUgZmFjZXQKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RydWN0IEN0eXBlOiBzdGQ6OmN0eXBlPGNoYXJUPgp7CiAgICB0eXBlZGVmIHN0ZDo6Y3R5cGU8Y2hhclQ+IEJhc2U7CgogICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlOjpjaGFyX3R5cGUgY2hhcl90eXBlOwoKICAgIHN0YXRpYyBpbnQgbl93aWRlbl87CgogICAgQ3R5cGUgKCk6IEJhc2UgKDAsIDAsIDEpIHsgfQoKICAgIHZpcnR1YWwgY2hhcl90eXBlIGRvX3dpZGVuIChjaGFyIGMpIGNvbnN0IHsKICAgICAgICArK25fd2lkZW5fOwoKICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlICcwJzogYyA9ICc5JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnMSc6IGMgPSAnOCc7IGJyZWFrOwogICAgICAgIGNhc2UgJzInOiBjID0gJzcnOyBicmVhazsKICAgICAgICBjYXNlICczJzogYyA9ICc2JzsgYnJlYWs7CiAgICAgICAgY2FzZSAnNCc6IGMgPSAnNSc7IGJyZWFrOwogICAgICAgIGNhc2UgJzUnOiBjID0gJzQnOyBicmVhazsKICAgICAgICBjYXNlICc2JzogYyA9ICczJzsgYnJlYWs7CiAgICAgICAgY2FzZSAnNyc6IGMgPSAnMic7IGJyZWFrOwogICAgICAgIGNhc2UgJzgnOiBjID0gJzEnOyBicmVhazsKICAgICAgICBjYXNlICc5JzogYyA9ICcwJzsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2hhcl90eXBlIChjKTsKICAgIH0KCiAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKICAgIGRvX3dpZGVuIChjb25zdCBjaGFyICpsbywgY29uc3QgY2hhciAqaGksIGNoYXJfdHlwZSAqZHN0KSBjb25zdCB7CiAgICAgICAgcmV0dXJuIEJhc2U6OmRvX3dpZGVuIChsbywgaGksIGRzdCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CmludCBDdHlwZTxjaGFyVD46Om5fd2lkZW5fOwoKaW50IGZvbyAoKQp7CiAgICBzdGF0aWMgaW50IGk7CgogICAgcmV0dXJuICsraTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpzdHJ1Y3QgUHVuY3REYXRhCnsKICAgIHN0YXRpYyBjaGFyVCAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWxfcG9pbnRfIFsyXTsKICAgIHN0YXRpYyBjaGFyVCAgICAgICAgICAgICAgICAgICAgIHRob3VzYW5kc19zZXBfIFsyXTsKICAgIHN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgKmdyb3VwaW5nXyBbMl07CiAgICBzdGF0aWMgY29uc3QgY2hhclQgICAgICAgICAgICAgICpjdXJyX3N5bWJvbF8gWzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXJUICAgICAgICAgICAgICAqcG9zaXRpdmVfc2lnbl8gWzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXJUICAgICAgICAgICAgICAqbmVnYXRpdmVfc2lnbl8gWzJdOwogICAgc3RhdGljIHN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybiAgZm9ybWF0XyBbMl1bMl07CiAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICBmcmFjX2RpZ2l0c18gWzJdOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhcioKUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFsyXSA9IHsgIiIsICIiIH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CmNoYXJUClB1bmN0RGF0YTxjaGFyVD46OmRlY2ltYWxfcG9pbnRfIFsyXSA9IHsgJy4nLCAnLicgfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY2hhclQKUHVuY3REYXRhPGNoYXJUPjo6dGhvdXNhbmRzX3NlcF8gWzJdID0geyAnLCcsICcsJyB9OwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpjb25zdCBjaGFyVCoKUHVuY3REYXRhPGNoYXJUPjo6Y3Vycl9zeW1ib2xfIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhclQqClB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KY29uc3QgY2hhclQqClB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFsyXTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gWzJdWzJdID0gewogICAgeyAgIC8vIGxvY2FsCiAgICAgICAgeyB7IC8vIHBvc2l0aXZlCiAgICAgICAgICAgICAgICBzdGQ6Om1vbmV5X2Jhc2U6OnN5bWJvbCwgc3RkOjptb25leV9iYXNlOjpzaWduLAogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpub25lLCAgIHN0ZDo6bW9uZXlfYmFzZTo6dmFsdWUKICAgICAgICAgICAgfSB9LAogICAgICAgIHsgeyAvLyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6bm9uZSwgICBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlCiAgICAgICAgICAgIH0gfQogICAgfSwKCiAgICB7ICAgLy8gaW50ZXJuYXRpb25hbAogICAgICAgIHsgeyAvLyBwb3NpdGl2ZQogICAgICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6bm9uZSwgICBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlCiAgICAgICAgICAgIH0gfSwKICAgICAgICB7IHsgLy8gbmVnYXRpdmUKICAgICAgICAgICAgICAgIHN0ZDo6bW9uZXlfYmFzZTo6c3ltYm9sLCBzdGQ6Om1vbmV5X2Jhc2U6OnNpZ24sCiAgICAgICAgICAgICAgICBzdGQ6Om1vbmV5X2Jhc2U6Om5vbmUsICAgc3RkOjptb25leV9iYXNlOjp2YWx1ZQogICAgICAgICAgICB9IH0KICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4KaW50IFB1bmN0RGF0YTxjaGFyVD46OmZyYWNfZGlnaXRzXyBbMl07CgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBib29sIEludGw+CnN0cnVjdCBQdW5jdDogc3RkOjptb25leXB1bmN0PGNoYXJULCBJbnRsPiwgUHVuY3REYXRhPGNoYXJUPgp7CiAgICB0eXBlZGVmIHN0ZDo6bW9uZXlwdW5jdDxjaGFyVCwgSW50bD4gQmFzZTsKICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Y2hhcl90eXBlICAgICBjaGFyX3R5cGU7CiAgICB0eXBlZGVmIHR5cGVuYW1lIEJhc2U6OnN0cmluZ190eXBlICAgc3RyaW5nX3R5cGU7CgogICAgc3RhdGljIGludCBuX3Rob3VzYW5kc19zZXBfOyAgIC8vIG51bWJlciBvZiBjYWxscyB0byBkb190aG91c2FuZHNfc2VwKCkKCiAgICBQdW5jdCAoc3RkOjpzaXplX3QgcmVmKTogQmFzZSAocmVmKSB7IH0KCiAgICBjaGFyX3R5cGUgZG9fZGVjaW1hbF9wb2ludCAoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRoaXMtPmRlY2ltYWxfcG9pbnRfIFtJbnRsXTsKICAgIH0KCiAgICBpbnQgZG9fZnJhY19kaWdpdHMgKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5mcmFjX2RpZ2l0c18gW0ludGxdOwogICAgfQoKICAgIHZpcnR1YWwgc3RyaW5nX3R5cGUgZG9fY3Vycl9zeW1ib2wgKCkgY29uc3QgewogICAgICAgIGZvbyAoKTsKICAgICAgICByZXR1cm4gdGhpcy0+Y3Vycl9zeW1ib2xfIFtJbnRsXSA/CiAgICAgICAgICAgIHRoaXMtPmN1cnJfc3ltYm9sXyBbSW50bF0gOiBzdHJpbmdfdHlwZSAoKTsKICAgIH0KCiAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRvX2dyb3VwaW5nICgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gdGhpcy0+Z3JvdXBpbmdfIFtJbnRsXSA/IHRoaXMtPmdyb3VwaW5nXyBbSW50bF0gOiAiIjsKICAgIH0KCiAgICB2aXJ0dWFsIGNoYXJfdHlwZSBkb190aG91c2FuZHNfc2VwICgpIGNvbnN0IHsKICAgICAgICArK25fdGhvdXNhbmRzX3NlcF87CiAgICAgICAgcmV0dXJuIHRoaXMtPnRob3VzYW5kc19zZXBfIFtJbnRsXTsKICAgIH0KCiAgICB2aXJ0dWFsIHN0cmluZ190eXBlIGRvX3Bvc2l0aXZlX3NpZ24gKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5wb3NpdGl2ZV9zaWduXyAgW0ludGxdID8KICAgICAgICAgICAgdGhpcy0+cG9zaXRpdmVfc2lnbl8gW0ludGxdIDogc3RyaW5nX3R5cGUgKCk7CiAgICB9CgogICAgdmlydHVhbCBzdHJpbmdfdHlwZSBkb19uZWdhdGl2ZV9zaWduICgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gdGhpcy0+bmVnYXRpdmVfc2lnbl8gW0ludGxdID8KICAgICAgICAgICAgdGhpcy0+bmVnYXRpdmVfc2lnbl8gW0ludGxdIDogc3RyaW5nX3R5cGUgKCk7CiAgICB9CgogICAgdmlydHVhbCBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gZG9fcG9zX2Zvcm1hdCAoKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIHRoaXMtPmZvcm1hdF8gW0ludGxdWzBdOwogICAgfQoKICAgIHZpcnR1YWwgc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuIGRvX25lZ19mb3JtYXQgKCkgY29uc3QgewogICAgICAgIHJldHVybiB0aGlzLT5mb3JtYXRfIFtJbnRsXVsxXTsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgYm9vbCBJbnRsPgppbnQgUHVuY3Q8Y2hhclQsIEludGw+OjpuX3Rob3VzYW5kc19zZXBfOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kc3RydWN0IElvczogc3RkOjpiYXNpY19pb3M8Y2hhclQ+CnsKICAgIElvcyAoKSB7IHRoaXMtPmluaXQgKDApOyB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpzdHJ1Y3QgTW9uZXlHZXQ6IHN0ZDo6bW9uZXlfZ2V0PGNoYXJULCBjb25zdCBjaGFyVCo+IHsgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybgpzZXRfcGF0dGVybiAoY29uc3QgY2hhciAqZm9ybWF0KQp7CiAgICBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gcGF0OwoKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gc2l6ZW9mIHBhdC5maWVsZCAvIHNpemVvZiAqcGF0LmZpZWxkOyArK2kpIHsKICAgICAgICBzd2l0Y2ggKGZvcm1hdCBbaV0pIHsKICAgICAgICBjYXNlICdcMCc6IGNhc2UgJ0AnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpub25lOyBicmVhazsKICAgICAgICBjYXNlICdcMSc6IGNhc2UgJyAnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpzcGFjZTsgYnJlYWs7CiAgICAgICAgY2FzZSAnXDInOiBjYXNlICckJzogcGF0LmZpZWxkIFtpXSA9IHN0ZDo6bW9uZXlfYmFzZTo6c3ltYm9sOyBicmVhazsKICAgICAgICBjYXNlICdcMyc6IGNhc2UgJy0nOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjpzaWduOyBicmVhazsKICAgICAgICBjYXNlICdcNCc6IGNhc2UgJzEnOiBwYXQuZmllbGQgW2ldID0gc3RkOjptb25leV9iYXNlOjp2YWx1ZTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgX1JXU1REX0FTU0VSVCAoISEiYmFkIGZvcm1hdCBzcGVjaWZpZXIiKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBhdDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kdm9pZCBkb190ZXN0IChib29sICAgICAgICBpbnRsLCAgICAvLyBpbnRlcm5hdGlvbmFsPwogICAgICAgICAgICAgIGNoYXJUICAgICAgIHdoaWNoLCAgIC8vIHdoaWNoIG92ZXJsb2FkIHRvIGV4ZXJjaXNlCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqY25hbWUsICAgLy8gdGhlIG5hbWUgb2YgdGhlIGNoYXJUIHR5cGUKICAgICAgICAgICAgICBjb25zdCBjaGFyICp0bmFtZSwgICAvLyB0aGUgbmFtZSBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgdHlwZQogICAgICAgICAgICAgIGludCAgICAgICAgIGxpbmVubywgIC8vIGxpbmUgbnVtYmVyCiAgICAgICAgICAgICAgTG9uZ0RvdWJsZSAgdmFsLCAgICAgLy8gdGhlIGV4cGVjdGVkIGV4dHJhY3RlZCB2YWx1ZQogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgICAgIC8vIHRoZSBzZXF1ZW5jZSB0byBleHRyYWN0IGZyb20KICAgICAgICAgICAgICBpbnQgICAgICAgICBjb25zdW1lZCA9IC0xLCAgIC8vIGV4cGVjdGVkIG51bWJlciBleHRyYWN0aW9ucwogICAgICAgICAgICAgIGludCAgICAgICAgIGZsYWdzID0gMCwgICAgICAgLy8gaW5pdGlhbCBpb3MgZmxhZ3MKICAgICAgICAgICAgICBpbnQgICAgICAgICBlcnJfZXhwZWN0ID0gLTEsIC8vIGV4cGVjdGVkIGZpbmFsIHN0YXRlCiAgICAgICAgICAgICAgaW50ICAgICAgICAgZnJhY19kaWdpdHMgPSAwLCAvLyBmcmFjdGlvbmFsIGRpZ2l0cwogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtYXQgPSAwLCAgICAgICAgLy8gbW9uZXlfYmFzZTo6cGF0dGVybgogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmN1cnN5bSA9IDAsICAgICAgLy8gY3VycmVuY3kgc3ltYm9sCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3JvdXBpbmcgPSAiIikgICAvLyBncm91cGluZyBzdHJpbmcKewogICAgaWYgKCFyd19lbmFibGVkIChsaW5lbm8pKSB7CiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLCAidGVzdCBvbiBsaW5lICVkIGRpc2FibGVkIiwgbGluZW5vKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFmbWF0KSB7CiAgICAgICAgLy8gaWYgZm1hdCBpc24ndCBzZXQsIHVzZSB0aGUgZGVmYXVsdCBwYXR0ZXJuCiAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bW9uZXlfYmFzZTo6cGF0dGVybiBwYXQgPSB7IHsKICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpzeW1ib2wsIHN0ZDo6bW9uZXlfYmFzZTo6c2lnbiwKICAgICAgICAgICAgc3RkOjptb25leV9iYXNlOjpub25lLCAgIHN0ZDo6bW9uZXlfYmFzZTo6dmFsdWUKICAgICAgICB9IH07CgogICAgICAgIGZtYXQgPSBwYXQuZmllbGQ7CiAgICB9CiAgICBlbHNlCiAgICAgICAgZm1hdCA9IHNldF9wYXR0ZXJuIChmbWF0KS5maWVsZDsKCiAgICAvLyBsb2NhbCBmb3JtYXQ/ICh0aGUgb3Bwb3NpdGUgb2YgaW50ZXJhbnRpb25hbCkKICAgIGNvbnN0IGJvb2wgbG9jbCA9ICFpbnRsOwoKICAgIC8vIHRha2UgY2FyZSB0byBpbml0aWFsaXplIFB1bmN0IHN0YXRpYyBkYXRhIGJlZm9yZSBpbnN0YWxsaW5nCiAgICAvLyB0aGUgZmFjZXQgaW4gY2FzZSBsb2NhbGUgb3IgdGhlIGJhc2UgZmFjZXQgY2FsbHMgdGhlIG92ZXJyaWRkZW4KICAgIC8vIHZpcnR1YWxzIGVhcmx5IHRvIGNhY2hlIHRoZSByZXN1bHRzCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtpbnRsXVsxXS5maWVsZCBbMF0gPSBmbWF0IFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2ludGxdWzFdLmZpZWxkIFsxXSA9IGZtYXQgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbaW50bF1bMV0uZmllbGQgWzJdID0gZm1hdCBbMl07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtpbnRsXVsxXS5maWVsZCBbM10gPSBmbWF0IFszXTsKCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtsb2NsXVsxXS5maWVsZCBbMF0gPSBmbWF0IFszXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2xvY2xdWzFdLmZpZWxkIFsxXSA9IGZtYXQgWzJdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbbG9jbF1bMV0uZmllbGQgWzJdID0gZm1hdCBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpmb3JtYXRfIFtsb2NsXVsxXS5maWVsZCBbM10gPSBmbWF0IFswXTsKCiAgICAvLyB6ZXJvIG91dCBwb3NpdGl2ZSBmb3JtYXQgKG5vdCB1c2VkIGJ5IG1vbmV5X2dldCkKICAgIFB1bmN0RGF0YTxjaGFyVD46OmZvcm1hdF8gW2ludGxdWzBdID0gc3RkOjptb25leV9iYXNlOjpwYXR0ZXJuICgpOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Zm9ybWF0XyBbbG9jbF1bMF0gPSBzdGQ6Om1vbmV5X2Jhc2U6OnBhdHRlcm4gKCk7CgogICAgLy8gZXhwYW5kICh3aWRlbikgY3VycmVuY3kgc3ltYm9sCiAgICBQdW5jdERhdGE8Y2hhclQ+OjpjdXJyX3N5bWJvbF8gW2ludGxdID0gcndfZXhwYW5kICgoY2hhclQqKTAsIGN1cnN5bSk7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpjdXJyX3N5bWJvbF8gW2xvY2xdID0gMDsKICAgIAogICAgUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFtpbnRsXSA9IGdyb3VwaW5nOwogICAgUHVuY3REYXRhPGNoYXJUPjo6Z3JvdXBpbmdfIFtsb2NsXSA9IDA7CgogICAgUHVuY3REYXRhPGNoYXJUPjo6ZnJhY19kaWdpdHNfIFtpbnRsXSA9IGZyYWNfZGlnaXRzOwogICAgUHVuY3REYXRhPGNoYXJUPjo6ZnJhY19kaWdpdHNfIFtsb2NsXSA9IGZyYWNfZGlnaXRzICsgMTsKCiAgICBJb3M8Y2hhclQ+IGlvOwogICAgTW9uZXlHZXQ8Y2hhclQ+IG1nOwoKICAgIC8vIGNyZWF0ZSBkaXN0aW5jdCBwdW5jdHVhdGlvbiBmYWNldHMgZm9yIGVhY2ggaXRlcmF0aW9uIHRvIG1ha2Ugc3VyZQogICAgLy8gYW55IGRhdGEgY2FjaGVkIGluIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byB0aGUgZmFjZXQncyBwdWJsaWMKICAgIC8vIG1lbWJlciBmdW5jdGlvbnMgYXJlIGZsdXNoZWQKICAgIGlmIChpbnRsKSB7CiAgICAgICAgY29uc3Qgc3RkOjptb25leXB1bmN0PGNoYXJULCB0cnVlPiAqcGYgPSBuZXcgUHVuY3Q8Y2hhclQsIHRydWU+KDApOwogICAgICAgIGlvLmltYnVlIChzdGQ6OmxvY2FsZSAoaW8uZ2V0bG9jICgpLCBwZikpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3Qgc3RkOjptb25leXB1bmN0PGNoYXJULCBmYWxzZT4gKnBmID0gbmV3IFB1bmN0PGNoYXJULCBmYWxzZT4oMCk7CiAgICAgICAgaW8uaW1idWUgKHN0ZDo6bG9jYWxlIChpby5nZXRsb2MgKCksIHBmKSk7CiAgICB9CgogICAgaW8uZmxhZ3MgKHN0ZDo6aW9zX2Jhc2U6OmZtdGZsYWdzIChmbGFncykpOwoKICAgIC8vIGV4cGFuZCAod2lkZW4pIGlucHV0IHNlcXVlbmNlCiAgICBjb25zdCBjaGFyVCogY29uc3QgbmV4dCA9IHJ3X2V4cGFuZCAoKGNoYXJUKikwLCBzdHIpOwoKICAgIHN0ZDo6aW9zX2Jhc2U6Omlvc3RhdGUgZXJyID0gc3RkOjppb3NfYmFzZTo6Z29vZGJpdDsKCiAgICBjb25zdCBjaGFyVCAqbGFzdDsKCiAgICBpZiAoMCA9PSB3aGljaCkgeyAgIC8vIGV4ZXJjaXNlIGdldCAoLi4uLCBsb25nIGRvdWJsZSkKCiAgICAgICAgbGFzdCA9IG5leHQgKyBzdGQ6OmNoYXJfdHJhaXRzPGNoYXJUPjo6bGVuZ3RoIChuZXh0KTsKCiAgICAgICAgTG9uZ0RvdWJsZSB4ID0gMDsKCiAgICAgICAgbGFzdCA9IG1nLmdldCAobmV4dCwgbGFzdCwgaW50bCwgaW8sIGVyciwgeCk7CgogICAgICAgIGlmICgtMSA9PSBlcnJfZXhwZWN0KQogICAgICAgICAgICBlcnJfZXhwZWN0ID0gZXJyOwoKICAgICAgICBjb25zdCBpbnQgc3VjY2VzcyA9CiAgICAgICAgICAgICEoLTEgIT0gY29uc3VtZWQgJiYgbGFzdCAtIG5leHQgIT0gY29uc3VtZWQgfHwgZXJyICE9IGVycl9leHBlY3QpOwoKICAgICAgICByd19hc3NlcnQgKHN1Y2Nlc3MsIF9fRklMRV9fLCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgICAibW9uZXlfZ2V0PCVzPjo6Z2V0ICgleypBY30sIC4uLiwgJWIsIC4uLiwgJXMmKSwgIgogICAgICAgICAgICAgICAgICAgImF0ZSAlZCwgZXhwZWN0ZWQgJWQsIGZyYWNfZGlnaXRzID0gJWQsICIKICAgICAgICAgICAgICAgICAgICJmbGFncyA9ICV7SWZ9LCBncm91cGluZyA9ICUjcywgcGF0dGVybiA9ICV7TE19LCAiCiAgICAgICAgICAgICAgICAgICAic3RhdGUgPSAle0lzfSwgZXhwZWN0ZWQgJXtJc30iLAogICAgICAgICAgICAgICAgICAgY25hbWUsIGludCAoc2l6ZW9mICpuZXh0KSwgbmV4dCwgaW50bCwgdG5hbWUsCiAgICAgICAgICAgICAgICAgICBsYXN0IC0gbmV4dCwgY29uc3VtZWQsIGZyYWNfZGlnaXRzLAogICAgICAgICAgICAgICAgICAgZmxhZ3MsIGdyb3VwaW5nLCBmbWF0LAogICAgICAgICAgICAgICAgICAgZXJyLCBlcnJfZXhwZWN0KTsKCiAgICAgICAgcndfYXNzZXJ0ICgyID4gcndfbGRibGNtcCAoeCwgdmFsKSwgX19GSUxFX18sIGxpbmVubywKICAgICAgICAgICAgICAgICAgICJtb25leV9nZXQ8JXM+OjpnZXQgKCV7KkFjfSwgLi4uLCAlYiwgLi4uLCAlcyYpLCAiCiAgICAgICAgICAgICAgICAgICAiZ290ICVMZywgZXhwZWN0ZWQgJUxnLCBmcmFjX2RpZ2l0cyA9ICVkLCAiCiAgICAgICAgICAgICAgICAgICAiZmxhZ3MgPSAle0lmfXMsIGdyb3VwaW5nID0gJSNzLCBwYXR0ZXJuID0gJXtMTX0sICIKICAgICAgICAgICAgICAgICAgICJzdGF0ZSA9ICV7SXN9LCBleHBlY3RlZCAle0lzfSIsCiAgICAgICAgICAgICAgICAgICBjbmFtZSwgaW50IChzaXplb2YgKm5leHQpLCBuZXh0LCBpbnRsLCB0bmFtZSwKICAgICAgICAgICAgICAgICAgIHgsIHZhbCwgZnJhY19kaWdpdHMsCiAgICAgICAgICAgICAgICAgICBmbGFncywgZ3JvdXBpbmcsIGZtYXQsCiAgICAgICAgICAgICAgICAgICBlcnIsIGVycl9leHBlY3QpOwogICAgfQogICAgZWxzZSB7ICAgLy8gZXhlcmNpc2UgZ2V0ICguLi4sIHN0cmluZ190eXBlKQoKICAgICAgICBzdGF0aWMgY29uc3QgY2hhclQgaW5pdGlhbFtdID0geyAnKicsICcqJywgJyonLCAnXDAnIH07CiAgICAgICAgdHlwZW5hbWUgc3RkOjptb25leV9nZXQ8Y2hhclQsIGNvbnN0IGNoYXJUKj46OnN0cmluZ190eXBlIGJzIChpbml0aWFsKTsKCiAgICAgICAgbGFzdCA9IG5leHQgKyBzdGQ6OmNoYXJfdHJhaXRzPGNoYXJUPjo6bGVuZ3RoIChuZXh0KTsKCiAgICAgICAgbGFzdCA9IG1nLmdldCAobmV4dCwgbGFzdCwgaW50bCwgaW8sIGVyciwgYnMpOwoKICAgICAgICBpbnQgc3VjY2VzcyA9CiAgICAgICAgICAgICEoLTEgIT0gY29uc3VtZWQgJiYgbGFzdCAtIG5leHQgIT0gY29uc3VtZWQgfHwgZXJyICE9IGVycl9leHBlY3QpOwoKICAgICAgICByd19hc3NlcnQgKHN1Y2Nlc3MsIF9fRklMRV9fLCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgICAibW9uZXlfZ2V0PCVzPjo6Z2V0ICgleypBY30sIC4uLiwgJWIsIC4uLiwgIgogICAgICAgICAgICAgICAgICAgImJhc2ljX3N0cmluZzwlcz4mKSwgYXRlICVkLCBleHBlY3RlZCAlZCwgIgogICAgICAgICAgICAgICAgICAgImZyYWNfZGlnaXRzID0gJWQsIGZsYWdzID0gJXtJZn0sIGdyb3VwaW5nID0gJSNzIgogICAgICAgICAgICAgICAgICAgIiwgZm9ybWF0ID0gJXtMTX0sIHN0YXRlID0gJXtJc30sIGV4cGVjdGVkICV7SXN9IiwKICAgICAgICAgICAgICAgICAgIGNuYW1lLCBpbnQgKHNpemVvZiAqbmV4dCksIG5leHQsIGludGwsCiAgICAgICAgICAgICAgICAgICBjbmFtZSwgbGFzdCAtIG5leHQsIGNvbnN1bWVkLAogICAgICAgICAgICAgICAgICAgZnJhY19kaWdpdHMsIGZsYWdzLCBncm91cGluZywKICAgICAgICAgICAgICAgICAgIGZtYXQsIGVyciwgZXJyX2V4cGVjdCk7CgogICAgICAgIGlmIChzdWNjZXNzKSB7CgogICAgICAgICAgICBjaGFyIG5hcnJvd19idWYgWzQwOTZdOwogICAgICAgICAgICByd19uYXJyb3cgKG5hcnJvd19idWYsIGJzLmNfc3RyICgpKTsKCiAgICAgICAgICAgIExvbmdEb3VibGUgeCA9IDA7CgogICAgICAgICAgICAvLyBwcmV2ZW50IGdjYyB3YXJuaW5nOiBBTlNJIEMgZG9lcyBub3Qgc3VwcG9ydAogICAgICAgICAgICAvLyB0aGUgYEwnIGxlbmd0aCBtb2RpZmllcgogICAgICAgICAgICBjb25zdCBjaGFyIGZtdFtdID0gIiUiIF9SV1NURF9MREJMX1BSSU5URl9QUkVGSVggImciOwogICAgICAgICAgICBpbnQgbiA9IHN0ZDo6c3NjYW5mIChuYXJyb3dfYnVmLCBmbXQsICZ4KTsKCiAgICAgICAgICAgIHN1Y2Nlc3MgPSAKICAgICAgICAgICAgICAgICEoICAgZXJyX2V4cGVjdCAmIHN0ZDo6aW9zOjpmYWlsYml0ICYmICEqZ3JvdXBpbmcKICAgICAgICAgICAgICAgICAgJiYgKDEgPT0gbiB8fCBicyAhPSBpbml0aWFsKQogICAgICAgICAgICAgICAgICB8fCAhKGVycl9leHBlY3QgJiBzdGQ6Omlvczo6ZmFpbGJpdCkKICAgICAgICAgICAgICAgICAgJiYgMSA8IHJ3X2xkYmxjbXAgKHgsIHZhbCkpOwoKICAgICAgICAgICAgcndfYXNzZXJ0IChzdWNjZXNzLCBfX0ZJTEVfXywgbGluZW5vLAogICAgICAgICAgICAgICAgICAgICAgICJtb25leV9nZXQ8JXM+OjpnZXQgKCV7KkFjfSwgLi4uLCAlYiwgLi4uLCAiCiAgICAgICAgICAgICAgICAgICAgICAgImJhc2ljX3N0cmluZzwlcz4mKSwgZ290ICVzLCBleHBlY3RlZCAlTGcsICIKICAgICAgICAgICAgICAgICAgICAgICAiZnJhY19kaWdpdHMgPSAlZCwgZmxhZ3MgPSAle0lmfSwgZ3JvdXBpbmcgPSAlI3MsIgogICAgICAgICAgICAgICAgICAgICAgICIgcGF0dGVybiA9ICV7TE19LCBpb3N0YXRlID0gJXtJc30sIGV4cGVjdGVkICV7SXN9IiwKICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSwgaW50IChzaXplb2YgKm5leHQpLCBuZXh0LCBpbnRsLAogICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLCBicy5jX3N0ciAoKSwgdmFsLAogICAgICAgICAgICAgICAgICAgICAgIGZyYWNfZGlnaXRzLCBmbGFncywgZ3JvdXBpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgZm1hdCwgZXJyLCBlcnJfZXhwZWN0KTsKICAgICAgICB9CiAgICB9CgogICAgZGVsZXRlW10gUHVuY3REYXRhPGNoYXJUPjo6Y3Vycl9zeW1ib2xfIFtpbnRsXTsKICAgIGRlbGV0ZVtdIG5leHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIGZvciBjb252ZW5pZW5jZQojZGVmaW5lIGJvb2xhbHBoYSAgIHN0ZDo6aW9zX2Jhc2U6OmJvb2xhbHBoYQojZGVmaW5lIGRlYyAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmRlYwojZGVmaW5lIGZpeGVkICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmZpeGVkCiNkZWZpbmUgaGV4ICAgICAgICAgc3RkOjppb3NfYmFzZTo6aGV4CiNkZWZpbmUgaW50ZXJuYWwgICAgc3RkOjppb3NfYmFzZTo6aW50ZXJuYWwKI2RlZmluZSBsZWZ0ICAgICAgICBzdGQ6Omlvc19iYXNlOjpsZWZ0CiNkZWZpbmUgb2N0ICAgICAgICAgc3RkOjppb3NfYmFzZTo6b2N0CiNkZWZpbmUgcmlnaHQgICAgICAgc3RkOjppb3NfYmFzZTo6cmlnaHQKI2RlZmluZSBzY2llbnRpZmljICBzdGQ6Omlvc19iYXNlOjpzY2llbnRpZmljCiNkZWZpbmUgc2hvd2Jhc2UgICAgc3RkOjppb3NfYmFzZTo6c2hvd2Jhc2UKI2RlZmluZSBzaG93cG9pbnQgICBzdGQ6Omlvc19iYXNlOjpzaG93cG9pbnQKI2RlZmluZSBzaG93cG9zICAgICBzdGQ6Omlvc19iYXNlOjpzaG93cG9zCiNkZWZpbmUgc2tpcHdzICAgICAgc3RkOjppb3NfYmFzZTo6c2tpcHdzCiNkZWZpbmUgdW5pdGJ1ZiAgICAgc3RkOjppb3NfYmFzZTo6dW5pdGJ1ZgojZGVmaW5lIHVwcGVyY2FzZSAgIHN0ZDo6aW9zX2Jhc2U6OnVwcGVyY2FzZQojZGVmaW5lIGJpbiAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OmJpbgojZGVmaW5lIGFkanVzdGZpZWxkIHN0ZDo6aW9zX2Jhc2U6OmFkanVzdGZpZWxkCiNkZWZpbmUgYmFzZWZpZWxkICAgc3RkOjppb3NfYmFzZTo6YmFzZWZpZWxkCiNkZWZpbmUgZmxvYXRmaWVsZCAgc3RkOjppb3NfYmFzZTo6ZmxvYXRmaWVsZAojZGVmaW5lIG5vbG9jayAgICAgIHN0ZDo6aW9zX2Jhc2U6Om5vbG9jawojZGVmaW5lIG5vbG9ja2J1ZiAgIHN0ZDo6aW9zX2Jhc2U6Om5vbG9ja2J1ZgoKI2RlZmluZSBiYWRiaXQgICAgICBzdGQ6Omlvc19iYXNlOjpiYWRiaXQKI2RlZmluZSBlb2ZiaXQgICAgICBzdGQ6Omlvc19iYXNlOjplb2ZiaXQKI2RlZmluZSBmYWlsYml0ICAgICBzdGQ6Omlvc19iYXNlOjpmYWlsYml0CiNkZWZpbmUgZ29vZGJpdCAgICAgc3RkOjppb3NfYmFzZTo6Z29vZGJpdAoKCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kdm9pZCB0ZXN0X2dldCAoY2hhclQgb3B0LCBjb25zdCBjaGFyICpjbmFtZSwgY29uc3QgY2hhciAqdG5hbWUsIGJvb2wgaW50bCkKewojZGVmaW5lIFQgICAgICBpbnRsLCBvcHQsIGNuYW1lLCB0bmFtZSwgX19MSU5FX18KI2RlZmluZSBURVNUICAgZG9fdGVzdAoKICAgIGNvbnN0IGJvb2wgbG9jbCA9ICFpbnRsOwoKICAgIHJ3X2luZm8gKDAsIDAsIDAsCiAgICAgICAgICAgICAibW9uZXlfZ2V0PCVzLCBpc3RyZWFtYnVmX2l0ZXJhdG9yPCVzPiA+OjpnZXQgIgogICAgICAgICAgICAgIiguLi4sICVzJikgY29uc3QiLCBjbmFtZSwgY25hbWUsIHRuYW1lKTsKCiAgICAvLyAyMi4yLjYuMywgcDM6CiAgICAvLyBUaGUgZm9ybWF0IG9mIHRoZSBudW1lcmljIG1vbmV0YXJ5IHZhbHVlIGlzIGEgZGVjaW1hbCBudW1iZXI6CiAgICAvLyAgICAgdmFsdWUgOjo9IHVuaXRzIFsgZGVjaW1hbHBvaW50IFsgZGlnaXRzIF1dIHwgZGVjaW1hbHBvaW50IGRpZ2l0cwogICAgLy8gSWYgZnJhY19kaWdpdHMoKSByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUsIG9yCiAgICAvLyAgICAgdmFsdWUgOjo9IHVuaXRzCiAgICAvLyBvdGhlcndpc2UuIFRoZSBzeW1ib2wgZGVjaW1hbHBvaW50IGluZGljYXRlcyB0aGUgY2hhcmFjdGVyIHJldHVybmVkCiAgICAvLyBieSBkZWNpbWFsX3BvaW50KCkuIFRoZSBvdGhlciBzeW1ib2xzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CiAgICAvLyAgICAgdW5pdHMgOjo9IGRpZ2l0cyBbIHRob3VzYW5kc3NlcCB1bml0cyBdIGRpZ2l0cyA6Oj0gYWRpZ2l0IFsgZGlnaXRzIF0KCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbaW50bF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6dGhvdXNhbmRzX3NlcF8gW2ludGxdID0gJ1wwJzsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtsb2NsXSA9ICdcMCc7CgogICAgLy8gcGFyc2luZyB6ZXJvLCBubyBjdXJyX3N5bWJvbCBvciBzaWduLCBkZWZhdWx0IHBhdHRlcm4sIDAgZnJhY19kaWdpdHMKICAgIFRFU1QgKFQsIDAuMCwgIjAiLCAgIDEsIDAsIGVvZmJpdCk7CiAgICBURVNUIChULCAwLjAsICIwICIsICAxLCAwLCBnb29kYml0KTsKICAgIFRFU1QgKFQsIDAuMCwgIjAwIiwgIDIsIDAsIGVvZmJpdCk7CiAgICBURVNUIChULCAwLjAsICIwMDAiLCAzLCAwLCBlb2ZiaXQpOwoKICAgIC8vIG9wdGlvbmFsIHdoaXRlc3BhY2UgaXMgY29uc3VtZWQgd2hlcmUgbm9uZSBvciBzcGFjZSBhcHBlYXJzCiAgICBURVNUIChULCAwLjAsICIgMCIsICAgMiwgMCwgZW9mYml0KTsKICAgIFRFU1QgKFQsIDAuMCwgIiAgMCAiLCAzLCAwLCBnb29kYml0KTsKCiAgICAvLyB2ZXJpZnkgdGhhdCBkZWNpbWFsIHBvaW50IGlzbid0IGV4dHJhY3RlZCAoZnJhY19kaWdpdHMgPT0gMCkKICAgIFRFU1QgKFQsIDAuMCwgIjAuIiwgICAgMSwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAwLjAsICIwLjAiLCAgIDEsIDAsIGdvb2RiaXQpOwogICAgVEVTVCAoVCwgMC4wLCAiMC4wMCIsICAxLCAwLCBnb29kYml0KTsKICAgIFRFU1QgKFQsIDAuMCwgIjAwLjAiLCAgMiwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAwLjAsICIwMDAuMCIsIDMsIDAsIGdvb2RiaXQpOwoKICAgIC8vIHBhcnNpbmcgemVybywgbm9uLXplcm8gZnJhY19kaWdpdHMKICAgIFRFU1QgKFQsIDAuMCwgIjAuIiwgICAgMiwgMCwgZW9mYml0LCAgMSk7CiAgICBURVNUIChULCAwLjAsICIwLiAiLCAgIDIsIDAsIGdvb2RiaXQsIDIpOwogICAgVEVTVCAoVCwgMC4wLCAiLjAiLCAgICAyLCAwLCBlb2ZiaXQsICAzKTsKICAgIFRFU1QgKFQsIDAuMCwgIjAuMCIsICAgMywgMCwgZW9mYml0LCAgNCk7CiAgICBURVNUIChULCAwLjAsICIwLjAwIiwgIDQsIDAsIGVvZmJpdCwgIDUpOwogICAgVEVTVCAoVCwgMC4wLCAiMDAuMCIsICA0LCAwLCBlb2ZiaXQsICA2KTsKICAgIFRFU1QgKFQsIDAuMCwgIjAwLjAwIiwgNSwgMCwgZW9mYml0LCAgNyk7CgogICAgLy8gcGFyc2luZyB6ZXJvLCBiYWQgZm9ybWF0CiAgICBURVNUIChULCAwLjAsICIkMCIsICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICIrMCIsICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICItMCIsICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICIuMCIsICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICIuMSIsICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICIuIiwgICAgMCwgMCwgZmFpbGJpdCk7CiAgICBURVNUIChULCAwLjAsICIiLCAgICAgMCwgMCwgZW9mYml0IHwgZmFpbGJpdCk7CgogICAgLy8gcGFyc2luZyBub24temVybywgbm8gY3Vycl9zeW1ib2wgb3Igc2lnbiwgZGVmYXVsdCBwYXR0ZXJuLCAwIGZyYWNfZGlnaXRzCiAgICBURVNUIChULCAgIDEuMCwgIjEiLCAgICAxLCAwLCBlb2ZiaXQpOwogICAgVEVTVCAoVCwgICAyLjAsICIyIiwgICAgMSwgMCwgZW9mYml0KTsKICAgIFRFU1QgKFQsICAgMy4wLCAiMyIsICAgIDEsIDAsIGVvZmJpdCk7CiAgICBURVNUIChULCAgIDQuMCwgIjQiLCAgICAxLCAwLCBlb2ZiaXQpOwogICAgVEVTVCAoVCwgICA1LjAsICI1LjEiLCAgMSwgMCwgZ29vZGJpdCk7CiAgICBURVNUIChULCAgIDYuMCwgIjYuMjMiLCAxLCAwLCBnb29kYml0KTsKICAgIFRFU1QgKFQsICA3My4wLCAiNzMuNCIsIDIsIDAsIGdvb2RiaXQpOwogICAgVEVTVCAoVCwgODQ1LjAsICI4NDUuIiwgMywgMCwgZ29vZGJpdCk7CgogICAgLy8gcGFyc2luZyBub24temVybywgZnJhY19kaWdpdHMgPT0gMQogICAgVEVTVCAoVCwgMTAwLjAsICIxMCIsICAgMiwgMCwgZW9mYml0LCAxKTsKICAgIFRFU1QgKFQsICA5MC4wLCAiOSIsICAgIDEsIDAsIGVvZmJpdCwgMSk7CiAgICBURVNUIChULCAgODAuMCwgIjguIiwgICAyLCAwLCBlb2ZiaXQsIDEpOwogICAgVEVTVCAoVCwgICA3LjAsICIwLjciLCAgMywgMCwgZW9mYml0LCAxKTsKICAgIFRFU1QgKFQsICAgNi4wLCAiLjYiLCAgIDIsIDAsIGVvZmJpdCwgMSk7CiAgICBURVNUIChULCAgIDAuMCwgIi4wNSIsICAzLCAwLCBlb2ZiaXQsIDEpOwoKICAgIC8vIHBhcnNpbmcgbm9uLXplcm8sIGZyYWNfZGlnaXRzID4gMQogICAgVEVTVCAoVCwgICAgICAgICA0LjAsICIuMDQiLCAgICAgICAzLCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgICAgIDMyLjAsICIuMzIiLCAgICAgICAzLCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgICAgMjEwLjAsICIyLjEwIiwgICAgICA0LCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgICAxMDk4LjAsICIxMC45OCIsICAgICA1LCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgICAgOTg3LjAsICIwOS44NzYiLCAgICA2LCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgICA5ODc2LjAsICI5OC43NjUiLCAgICA2LCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgIDg3NjU0LjAsICI4NzYuNTQzMiIsICA4LCAwLCBlb2ZiaXQsIDIpOwogICAgVEVTVCAoVCwgICAgNzY1NDMyLjAsICI3NjUuNDMyMSIsICA4LCAwLCBlb2ZiaXQsIDMpOwogICAgVEVTVCAoVCwgICA2NTQzMjEwLjAsICI2NTQuMzIxMDkiLCA5LCAwLCBlb2ZiaXQsIDQpOwogICAgVEVTVCAoVCwgIDU0MzIxMDk4LjAsICI1NDMyLjEwOTgiLCA5LCAwLCBlb2ZiaXQsIDQpOwogICAgVEVTVCAoVCwgNDMyMTA5ODcwLjAsICI0MzIxMC45ODciLCA5LCAwLCBlb2ZiaXQsIDQpOwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtpbnRsXSA9ICcsJzsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnRob3VzYW5kc19zZXBfIFtsb2NsXSA9ICc7JzsKCiAgICAvLyBwYXJzaW5nIHdpdGggdGhvdXNhbmRzX3NlcCBhbmQvb3IgZ3JvdXBpbmcKICAgIFRFU1QgKFQsICAgICAgMC4wLCAiMCIsICAgICAgICAxLCAwLCBlb2ZiaXQsICAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgICAgIDAuMCwgIjAsMCIsICAgICAgMywgMCwgZW9mYml0LCAgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICAgICAwLjAsICIwLCIsICAgICAgIDEsIDAsIGdvb2RiaXQsIDAsIDAsICIiLCAiXDAiKTsKICAgIFRFU1QgKFQsICAgICAgMC4wLCAiMCwwLDAiLCAgICA1LCAwLCBlb2ZiaXQsICAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgICAgIDEuMCwgIjAsMCwxIiwgICAgNSwgMCwgZW9mYml0LCAgMCwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICAgICAyLjAsICIwLDAsMi4iLCAgIDUsIDAsIGdvb2RiaXQsIDAsIDAsICIiLCAiXDEiKTsKICAgIFRFU1QgKFQsICAgICAzMC4wLCAiMCwwLDMuIiwgICA2LCAwLCBlb2ZiaXQsICAxLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgICAgIDQuMCwgIjAsMC40IiwgICAgNSwgMCwgZW9mYml0LCAgMSwgMCwgIiIsICJcMSIpOwogICAgVEVTVCAoVCwgICA1NjcwLjAsICI1LDY3LjAiLCAgIDYsIDAsIGVvZmJpdCwgIDEsIDAsICIiLCAiXDIiKTsKICAgIFRFU1QgKFQsICAgNjc4OS4wLCAiNjc4LjkiLCAgICA1LCAwLCBlb2ZiaXQsICAxLCAwLCAiIiwgIlwzIik7CiAgICBURVNUIChULCA3ODkwMTIuMCwgIjcsODkwLjEyIiwgOCwgMCwgZW9mYml0LCAgMiwgMCwgIiIsICJcMyIpOwoKICAgIC8vIDIyLjIuNi4xLjIsIHAxOiB0aG91c2FuZHNfc2VwLWFyYXRvcnMgYXJlIG9wdGlvbmFsCiAgICBURVNUIChULCA4OTAxMjMuMCwgIjg5MC4xMjMiLCA3LCAwLCBlb2ZiaXQsIDMsIDAsICIiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDkwMTIzNC4wLCAiOTAxLjIzNCIsIDcsIDAsIGVvZmJpdCwgMywgMCwgIiIsICJcMiIpOwogICAgVEVTVCAoVCwgMTIzNDUwLjAsICIwMTIzLjQ1IiwgNywgMCwgZW9mYml0LCAzLCAwLCAiIiwgIlwzIik7CgogICAgLy8gaW52YWxpZCB1c2Ugb2YgdGhvdXNhbmRzX3NlcCB3aXRoIGVtcHR5IGdyb3VwaW5nCiAgICAvLyB0aGUgZmlyc3QgdGhvdXNhbmRzX3NlcCB0ZXJtaW5hdGVzIHBhcnNpbmcgaW4gZ3JvdXBpbmcgaXMgZW1wdHkKICAgIFRFU1QgKFQsICAwLjAsICIsIiwgICAgIDAsIDAsIGZhaWxiaXQsICAgICAgICAgIDAsIDAsICIiLCAiXDAiKTsKICAgIFRFU1QgKFQsICAwLjAsICIsMCIsICAgIDAsIDAsIGZhaWxiaXQsICAgICAgICAgIDAsIDAsICIiLCAiXDAiKTsKCiAgICAvLyBpbnZhbGlkIGdyb3VwaW5nCiAgICBURVNUIChULCAgMS4wLCAiLDEiLCAgICAyLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgMi4wLCAiMiwiLCAgICAyLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgMy4wLCAiLDMsIiwgICAzLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgNC4wLCAiLCw0IiwgICAzLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgNS4wLCAiNSwsIiwgICAzLCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwxIik7CiAgICBURVNUIChULCAgNi4wLCAiLDYsLCIsICA0LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwyIik7CiAgICBURVNUIChULCAgNy4wLCAiLCw3LCIsICA0LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwyIik7CiAgICBURVNUIChULCAgOC4wLCAiMCwsOCIsICA0LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwyIik7CiAgICBURVNUIChULCAgOS4wLCAiMCwwLDkiLCA1LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwyIik7CiAgICBURVNUIChULCAxMC4wLCAiMCwxMCwiLCA1LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiIiwgIlwyIik7CgoKICAgIC8vIGRlZmF1bHQgcGF0dGVybjogeyBzeW1ib2wgc2lnbiBub25lIHZhbHVlIH0sIGUuZy4sICIkLTEiCgogICAgLy8gcGFyc2luZyB3aXRoIGEgcmVxdWlyZWQgY3Vycl9zeW1ib2wsIG5vIHNpZ24sIGFuZCBkZWZhdWx0IHBhdHRlcm4KICAgIFRFU1QgKFQsICAgMC4wLCAiJDAiLCAgICAgIDIsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgICAxLjAsICIkMSIsICAgICAgMiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICIkIik7CiAgICBURVNUIChULCAgIDIuMCwgIiQgMiIsICAgICAzLCBzaG93YmFzZSwgZW9mYml0LCAgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsICAgMy4wLCAiJCAgMyIsICAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgNDU2LjAsICIkNDU2IiwgICAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICIkIik7CiAgICBURVNUIChULCAgNTYuMCwgIiQ1NiQiLCAgICAzLCBzaG93YmFzZSwgZ29vZGJpdCwgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsICAgNi4wLCAiJDYkNyIsICAgIDIsIHNob3diYXNlLCBnb29kYml0LCAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgICA3LjAsICJMNyIsICAgICAgMiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICJMIik7CiAgICBURVNUIChULCAgIDguMCwgIkRNICA4IiwgICA1LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgMCwgIkRNIik7CiAgICBURVNUIChULCAgIDkuMCwgIlVTRDkiLCAgICA0LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgMCwgIlVTRCIpOwogICAgVEVTVCAoVCwgIDEwLjAsICJZRU4gMTAiLCAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsIDAsICJZRU4iKTsKICAgIFRFU1QgKFQsICAxMS4wLCAiJENBTjExJCIsIDYsIHNob3diYXNlLCBnb29kYml0LCAwLCAwLCAiJENBTiIpOwogICAgVEVTVCAoVCwgMTIxLjAsICJrcjEyLjEiLCAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDEsIDAsICJrciIpOwogICAgVEVTVCAoVCwgMTMyLjAsICJGVDEzLjIxIiwgNywgc2hvd2Jhc2UsIGVvZmJpdCwgIDEsIDAsICJGVCIpOwoKICAgIC8vIGludmFsaWQgaW5wdXQgd2l0aCBhIHJlcXVpcmVkIChzaG93YmFzZSBzZXQpIGN1cnJfc3ltYm9sCiAgICBURVNUIChULCAwLjAsICJGTFUiLCAgICAzLCBzaG93YmFzZSwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIkZMVVgiKTsKICAgIFRFU1QgKFQsIDAuMCwgIkZyLiArMSIsIDQsIHNob3diYXNlLCBmYWlsYml0LCAwLCAwLCAiRnIuIik7CiAgICBURVNUIChULCAwLjAsICJQdHMxIiwgICAzLCBzaG93YmFzZSwgZmFpbGJpdCwgMCwgMCwgIlB0cy4iKTsKICAgIFRFU1QgKFQsIDAuMCwgIiBLbjEiLCAgIDAsIHNob3diYXNlLCBmYWlsYml0LCAwLCAwLCAiS24iKTsKICAgIFRFU1QgKFQsIDAuMCwgIkwuMSIsICAgIDIsIHNob3diYXNlLCBmYWlsYml0LCAwLCAwLCAiTC4gIik7CiAgICBURVNUIChULCAwLjAsICIxIiwgICAgICAwLCBzaG93YmFzZSwgZmFpbGJpdCwgMCwgMCwgIlRMIik7CgogICAgLy8gcGFyc2luZyB3aXRoIGFuIG9wdGlvbmFsIChzaG93YmFzZSBjbGVhcikgY3Vycl9zeW1ib2wKICAgIFRFU1QgKFQsIDEyLjAsICIxMiIsICAgICAyLCAwLCBlb2ZiaXQsIDAsIDAsICJtayIpOwogICAgVEVTVCAoVCwgMTMuMCwgImRpbjEzIiwgIDUsIDAsIGVvZmJpdCwgMCwgMCwgImRpbiIpOwogICAgVEVTVCAoVCwgMTQuMCwgIkVzYyAxNCIsIDYsIDAsIGVvZmJpdCwgMCwgMCwgIkVzYyIpOwoKICAgIC8vIHBhcnNpbmcgd2l0aCBhIHNpbXBsZSBub24tZW1wdHkgc2lnbgoKICAgIHN0YXRpYyBjb25zdCBjaGFyVCBwbHVzW11bMl0gID0geyB7ICcrJywgJ1wwJyB9LCB7ICdcMCcgfSB9OwogICAgc3RhdGljIGNvbnN0IGNoYXJUIG1pbnVzW11bMl0gPSB7IHsgJy0nLCAnXDAnIH0sIHsgJ1wwJyB9IH07CgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSBtaW51cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSBwbHVzIFsxXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IG1pbnVzIFsxXTsKCiAgICBURVNUIChULCAgMTUuMCwgIisxNSIsICAgICAzLCAwLCBlb2ZiaXQsICAwLCAwLCAiIik7CiAgICBURVNUIChULCAgMTYuMCwgIisgMTYiLCAgICA0LCAwLCBlb2ZiaXQsICAwLCAwLCAiIik7CiAgICBURVNUIChULCAgMTcuMCwgIisgIDE3LjAiLCA1LCAwLCBnb29kYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAgMTguMCwgIisgIDE4KyIsICA1LCAwLCBnb29kYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAgMTkuMCwgIjE5KyIsICAgICAyLCAwLCBnb29kYml0LCAwLCAwLCAiIik7CgogICAgVEVTVCAoVCwgLTIwLjAsICItMjAiLCAgICAgMywgMCwgZW9mYml0LCAgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgLTIxLjAsICItIDIxIiwgICAgNCwgMCwgZW9mYml0LCAgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgLTIyLjAsICItICAyMi4xIiwgNSwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgLTIzLjAsICItIDIzLSIsICAgNCwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDI0LjAsICIyNCsiLCAgICAgMiwgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgLTI1LjAsICItMjUrIiwgICAgMywgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgIDI2LjAsICIrMjYtIiwgICAgMywgMCwgZ29vZGJpdCwgMCwgMCwgIiIpOwoKICAgIC8vIGludmFsaWQgaW5wdXQKICAgIFRFU1QgKFQsIDAuMCwgIisrMS4yMyIsICAgIDEsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0tMi4zNCIsICAgIDEsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIistMy40NSIsICAgIDEsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0rNC41NiIsICAgIDEsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0gKzUuNjciLCAgIDIsIDAsIGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIisiLCAgICAgICAgIDEsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDAuMCwgIi0iLCAgICAgICAgIDEsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIiKTsKCiAgICAvLyBwYXJzaW5nIHdpdGggYSBtdWx0aS1jaGFyIG5vbi1lbXB0eSBzaWduCgogICAgc3RhdGljIGNvbnN0IGNoYXJUIHBsdXNfcGx1c1tdWzNdICAgPSB7IHsgJysnLCAnKycsICdcMCcgfSwgeyAnXDAnIH0gfTsKICAgIHN0YXRpYyBjb25zdCBjaGFyVCBtaW51c19taW51c1tdWzNdID0geyB7ICctJywgJy0nLCAnXDAnIH0sIHsgJ1wwJyB9IH07CgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1c19wbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IG1pbnVzX21pbnVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXNfcGx1cyBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBtaW51c19taW51cyBbMV07CgogICAgVEVTVCAoVCwgIDI3LjAsICIrMjcrIiwgICAgNCwgMCwgZW9mYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCAgMjguMCwgIisgIDI4KyIsICA2LCAwLCBlb2ZiaXQsIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIC0yOS4wLCAiLTIuOTktIiwgIDYsIDAsIGVvZmJpdCwgMSwgMCwgIiIpOwogICAgVEVTVCAoVCwgLTMwLjAsICItIDMuMDktIiwgNywgMCwgZW9mYml0LCAxLCAwLCAiIik7CgogICAgLy8gd2l0aCBhIHNpbXBsZSBjdXJyZW5jeSBzeW1ib2wKICAgIFRFU1QgKFQsICAzMS4wLCAiJCszMSsiLCAgICA1LCAwLCBlb2ZiaXQsIDAsIDAsICIkIik7CiAgICBURVNUIChULCAgMzIuMCwgIiQrICAzMisiLCAgNywgMCwgZW9mYml0LCAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgLTMzLjAsICIkLTMuMzAtIiwgIDcsIDAsIGVvZmJpdCwgMSwgMCwgIiQiKTsKICAgIFRFU1QgKFQsIC0zNC4wLCAiJC0gMy40MS0iLCA4LCAwLCBlb2ZiaXQsIDEsIDAsICIkIik7CgogICAgLy8gd2l0aCBhIG11bHRpLWNoYXIgY3VycmVuY3kgc3ltYm9sCiAgICBURVNUIChULCAgMzUuMCwgIlVTRCszNSsiLCAgICAgNywgMCwgZW9mYml0LCAwLCAwLCAiVVNEIik7CiAgICBURVNUIChULCAgMzYuMCwgIlVTRCsgIDM2KyIsICAgOSwgMCwgZW9mYml0LCAwLCAwLCAiVVNEIik7CiAgICBURVNUIChULCAtMzcuMCwgIlVTRC0zLjcwLSIsICAgOSwgMCwgZW9mYml0LCAxLCAwLCAiVVNEIik7CiAgICBURVNUIChULCAtMzguMCwgIlVTRC0gMy44MS0iLCAxMCwgMCwgZW9mYml0LCAxLCAwLCAiVVNEIik7CgogICAgLy8gaW52YWxpZCBpbnB1dAogICAgVEVTVCAoVCwgMC4wLCAiKzMxICsiLCAgICAgMywgMCwgZmFpbGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgMC4wLCAiKyAgMzIgKyIsICAgNSwgMCwgZmFpbGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgMC4wLCAiLTMzLjkgLSIsICAgMywgMCwgZmFpbGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgMC4wLCAiLSAzLjQ5IC0iLCAgNiwgMCwgZmFpbGJpdCwgMSwgMCwgIiIpOwogICAgVEVTVCAoVCwgMC4wLCAiJCszNSArIiwgICAgNCwgMCwgZmFpbGJpdCwgMCwgMCwgIiQiKTsKICAgIC8vIHRoZSBzcGFjZSBiZWxvdyBpcyByZWFkIHNpbmNlIHRoZSBvcHRpb25hbCBzaWduIGlzIGNvbnNpZGVyZWQgbWlzc2luZwogICAgVEVTVCAoVCwgMC4wLCAiJCArMzYrIiwgICAgMiwgMCwgZmFpbGJpdCwgMCwgMCwgIiQiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQrICAzNyArIiwgIDYsIDAsIGZhaWxiaXQsIDAsIDAsICIkIik7CiAgICBURVNUIChULCAwLjAsICIkLTMuODAgLSIsICAzLCAwLCBmYWlsYml0LCAwLCAwLCAiJCIpOwogICAgVEVTVCAoVCwgMC4wLCAiJC0gMy45MSAtIiwgNywgMCwgZmFpbGJpdCwgMSwgMCwgIiQiKTsKCiAgICBzdGF0aWMgY29uc3QgY2hhclQgcGx1c19taW51c1tdWzNdID0geyB7ICcrJywgJy0nLCAnXDAnIH0sIHsgJ1wwJyB9IH07CgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1c19wbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXNfcGx1cyBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSBwbHVzX21pbnVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXNfbWludXMgWzFdOwoKICAgIC8vIDIyLjIuNi4xLjIsIHAzOiBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHBvc2l0aXZlCiAgICAvLyBhbmQgbmVnYXRpdmUgc2lnbiBpcyB0aGUgc2FtZSwgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZQogICAgVEVTVCAoVCwgNDAuMCwgICAiKzQwKyIsIDQsIDAsICAgICAgICBlb2ZiaXQsICAwLCAwLCAiIik7CiAgICBURVNUIChULCA0MS4wLCAgICIrNDEtIiwgNCwgMCwgICAgICAgIGVvZmJpdCwgIDAsIDAsICIiKTsKICAgIFRFU1QgKFQsIDQyLjAsICAiKzQyKyAiLCA0LCAwLCAgICAgICAgZ29vZGJpdCwgMCwgMCwgIiIpOwogICAgVEVTVCAoVCwgNDMuMCwgICIrNDMtICIsIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAwLCAiIik7CiAgICBURVNUIChULCA0NC4wLCAiKzQ0ICQrIiwgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsIDQ1LjAsICIrNDUgJC0iLCA2LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgNDYuMCwgIis0NiQrICIsIDUsIHNob3diYXNlLCBnb29kYml0LCAwLCAiLTEkQCIsICIkIik7CiAgICBURVNUIChULCA0Ny4wLCAiKzQ3JC0gIiwgNSwgc2hvd2Jhc2UsIGdvb2RiaXQsIDAsICItMSRAIiwgIiQiKTsKCiAgICAvLyBub25lID0gMCwgc3BhY2UgPSAxLCBzeW1ib2wgPSAyLCBzaWduID0gMywgdmFsdWUgPSA0CgogICAgLy8gdGVzdCB2YXJpb3VzIHBhdHRlcm5zCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbaW50bF0gPSBwbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gbWludXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gbWludXMgWzFdOwoKICAgIFRFU1QgKFQsICAtMTAwLjAsICIkLTEiLCAgIDMsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiJC0xQCIsICIkIik7CiAgICBURVNUIChULCAgLTIwMC4wLCAiJC0yICIsICAzLCBzaG93YmFzZSwgZ29vZGJpdCwgMiwgIiQtMUAiLCAiJCIpOwogICAgLy8gd2hlcmUgbm9uZSBhcHBlYXJzIGluIHRoZSBwYXR0ZXJuLCB3aGl0ZXNwYWNlIGlzIG9wdGlvbmFsCiAgICBURVNUIChULCAgLTMwMC4wLCAiLTMkIiwgICAzLCBzaG93YmFzZSwgZW9mYml0LCAgMiwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgIC00MDAuMCwgIi00ICQiLCAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICItMUAkIiwgIiQiKTsKICAgIC8vIHdoZXJlIHNwYWNlIGFwcGVhcnMgaW4gdGhlIHBhdHRlcm4sIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcmVxdWlyZWQKICAgIFRFU1QgKFQsICAgIDAuMCwgIi01JCIsICAgIDIsIHNob3diYXNlLCBmYWlsYml0LCAyLCAiLTEgJCIsICIkIik7CiAgICBURVNUIChULCAgLTYwMC4wLCAiLTYgJCIsICA0LCBzaG93YmFzZSwgZW9mYml0LCAgMiwgIi0xICQiLCAiJCIpOwogICAgVEVTVCAoVCwgIC03MDAuMCwgIi03XHQkIiwgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICItMSAkIiwgIiQiKTsKCiAgICBURVNUIChULCAgICAgMC4wLCAiLTgkIiwgICAxLCBzaG93YmFzZSwgZmFpbGJpdCwgMiwgIi0gMSQiLCAiJCIpOwogICAgVEVTVCAoVCwgIC05MDAuMCwgIi1cbjkkIiwgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICItIDEkIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMDAwLjAsICItIDEwJCIsIDUsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiLSAxJCIsICIkIik7CiAgICAvLyB3aGl0ZSBzcGFjZSBpcyByZXF1aXJlZCBldmVuIGF0IHRoZSBiZWdpbm5pbmcgb2YgaW5wdXQKICAgIC8vIChpZiB0aGUgb3B0aW9uYWwgc2lnbiBvciBzeW1ib2wgaXMgbWlzc2luZykKICAgIFRFU1QgKFQsICAgICAwLjAsICIxMSQiLCAgIDAsIHNob3diYXNlLCBmYWlsYml0LCAyLCAiLSAxJCIsICIkIik7CgogICAgVEVTVCAoVCwgLTEyMDAuMCwgIjEyJC0iLCAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICIxQCQtIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMzAwLjAsICIxMyAkLSIsIDUsIHNob3diYXNlLCBlb2ZiaXQsICAyLCAiMUAkLSIsICIkIik7CiAgICBURVNUIChULCAgICAgMC4wLCAiMTQkLSIsICAyLCBzaG93YmFzZSwgZmFpbGJpdCwgMiwgIjEgJC0iLCAiJCIpOwogICAgVEVTVCAoVCwgLTE1MDAuMCwgIjE1ICQtIiwgNSwgc2hvd2Jhc2UsIGVvZmJpdCwgIDIsICIxICQtIiwgIiQiKTsKCiAgICBjb25zdCBjaGFyVCBwYXJlbnNbXVszXSA9IHsgeyAnKCcsICcpJywgJ1wwJyB9LCB7ICdcMCcgfSB9OwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gcGFyZW5zIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IHBhcmVucyBbMV07CgogICAgLy8geyBzaWduLCBzcGFjZSwgdmFsdWUsIHN5bWJvbCB9LCB3aXRoIHN5bWJvbCByZXF1aXJlZAogICAgVEVTVCAoVCwgLTkwLjAsICIoIDkkKSIsICAgIDUsIHNob3diYXNlLCBlb2ZiaXQsIDEsICItIDEkIiwgIiQiKTsKICAgIFRFU1QgKFQsIC04MC4wLCAiKCA4U0lUKSIsICA3LCBzaG93YmFzZSwgZW9mYml0LCAxLCAiLSAxJCIsICJTSVQiKTsKICAgIFRFU1QgKFQsIC04MS4wLCAiKCA4LjFGcikiLCA4LCBzaG93YmFzZSwgZW9mYml0LCAxLCAiLSAxJCIsICJGciIpOwogICAgVEVTVCAoVCwgIDcwLjAsICIgN1B0YXMiLCAgIDYsIHNob3diYXNlLCBlb2ZiaXQsIDEsICItIDEkIiwgIlB0YXMiKTsKICAgIFRFU1QgKFQsICA2MS4wLCAiIDYuMUxlayIsICA3LCBzaG93YmFzZSwgZW9mYml0LCAxLCAiLSAxJCIsICJMZWsiKTsKCiAgICAvLyB7IHNpZ24sIHZhbHVlLCBub25lLCBzeW1ib2wgfQogICAgVEVTVCAoVCwgIDEwMS4wLCAiMTAxICAgICIsIDMsIDAsICAgICAgICBnb29kYml0LCAwLCAiLTFAJCIsICIiKTsKICAgIC8vIHRyYWlsaW5nIHNwYWNlIG5vdCBleHRyYWN0ZWQgc2luY2UgY3VycmVuY3kgc3ltYm9sIGlzIG9wdGlvbmFsCiAgICBURVNUIChULCAgMTAyLjAsICIxMDIgIiwgMywgMCwgZ29vZGJpdCwgMCwgIi0xQCQiLCAiICIpOwogICAgLy8gYWxsIHNwYWNlcyBleHRyYWN0ZWQgc2luY2UgY3VycmVuY3kgc3ltYm9sIChsYXN0KSBpcyBtYW5kYXRvcnkKICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBmYWNldCBkb2Vzbid0IGV4dHJhY3QgdG9vIG1hbnkgb3B0aW9uYWwgc3BhY2VzCiAgICAvLyBsZWF2aW5nIG5vbmUgZm9yIHRoZSBmaW5hbCByZXF1aXJlZCBjdXJyZW5jeSBzeW1ib2wKICAgIFRFU1QgKFQsICAxMDMuMCwgIjEwMyAiLCA0LCBzaG93YmFzZSwgZW9mYml0LCAwLCAiLTFAJCIsICIgIik7CgogICAgLy8gMjIuMi42LjEuMiwgcDM6IFtFeGFtcGxlOiBJZiBzaG93YmFzZSBpcyBvZmYsIHRoZW4gZm9yCiAgICAvLyBhIG5lZ2F0aXZlIHNpZ24gdmFsdWUgb2YgIigpIiBhbmQgYSBjdXJyZW5jeSBzeW1ib2wgb2YgIkwiLAogICAgLy8gaW4gIigxMDAgTCkiIHRoZSAiTCIgaXMgY29uc3VtZWQ7IGJ1dCBpZiBuZWdhdGl2ZSBzaWduIGlzICKtIiwKICAgIC8vIHRoZSAiTCIgaW4gIq0xMDAgTCIgaXMgbm90IGNvbnN1bWVkLiBdCiAgICBURVNUIChULCAtMTA0LjAsICIoMTA0IEwpIiwgNywgMCwgICAgICAgIGVvZmJpdCwgIDAsICItMUAkIiwgIkwiKTsKICAgIFRFU1QgKFQsIC0xMDUuMCwgIigxMDUgTCkiLCA3LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiTCIpOwoKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtpbnRsXSA9IHBsdXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gbWludXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2xvY2xdID0gcGx1cyBbMV07CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSBtaW51cyBbMV07CgogICAgLy8geyBzaWduLCB2YWx1ZSwgbm9uZSwgc3ltYm9sIH0KICAgIC8vIHRyYWlsaW5nIG9wdGlvbmFsIGN1cnJfc3ltYm9sIG9yIHdoaXRlc3BhY2UgcHJlY2VkaW5nIGl0IChyZWdhcmRsZXNzCiAgICAvLyBvZiB3aGV0aGVyIHRoZSBsYXR0ZXIgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwpIGlzIG5vdCBjb25zdW1lZCkKICAgIFRFU1QgKFQsIC0xMDEuMCwgIi0xMDEgJCIsIDQsIDAsICAgICAgICBnb29kYml0LCAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCAtMTAyLjAsICItMTAyICQiLCA2LCBzaG93YmFzZSwgZW9mYml0LCAwLCAiLTFAJCIsICIkIik7CgogICAgVEVTVCAoVCwgLTEwMy4wLCAiLTEwMyAkIiwgNCwgMCwgICAgICAgIGdvb2RiaXQsIDAsICItMSAkIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMDQuMCwgIi0xMDQgJCIsIDYsIHNob3diYXNlLCBlb2ZiaXQsIDAsICItMSAkIiwgIiQiKTsKCiAgICAvLyB7IHNpZ24sIHZhbHVlLCBzeW1ib2wsIG5vbmUgfQogICAgVEVTVCAoVCwgLTEwNS4wLCAiLTEwNSAkIiwgNCwgMCwgICAgICAgIGdvb2RiaXQsIDAsICItMSRAIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMDYuMCwgIi0xMDYkICIsIDUsIHNob3diYXNlLCBnb29kYml0LCAwLCAiLTEkQCIsICIkIik7CgogICAgLy8geyB2YWx1ZSwgbm9uZSwgc2lnbiwgc3ltYm9sIH0KICAgIC8vIHRyYWlsaW5nIHdoaXRlc3BhY2UgbWF5IG5lZWQgdG8gYmUgZXh0cmFjdGVkIGlmIGNoYXJhY3RlcnMgbWF5CiAgICAvLyBiZSBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHBhdHRlcm4gKGUuZy4sIHNpZ24gb3Igc3ltYm9sKQogICAgVEVTVCAoVCwgIDEwNy4wLCAiMTA3ICQiLCAgNCwgMCwgICAgICAgIGdvb2RiaXQsIDAsICIxQC0kIiwgIiQiKTsKICAgIC8vIHRyYWlsaW5nIG9wdGlvbmFsIGN1cnJfc3ltYm9sIGlzIG5vdCBjb25zdW1lZAogICAgVEVTVCAoVCwgLTEwOC4wLCAiMTA4LSQiLCAgNCwgMCwgICAgICAgIGdvb2RiaXQsIDAsICIxQC0kIiwgIiQiKTsKICAgIC8vIHRyYWlsaW5nIHJlcXVpcmVkIGN1cnJfc3ltYm9sIGlzIGNvbnN1bWVkCiAgICBURVNUIChULCAtMTA5LjAsICIxMDktJCIsICA1LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIjFALSQiLCAiJCIpOwoKICAgIGNvbnN0IGNoYXJUIG1pbnVzX3NwYWNlW11bM10gPSB7IHsgJy0nLCAnICcsICdcMCcgfSwgeyAnXDAnIH0gfTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IG1pbnVzX3NwYWNlIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IG1pbnVzX3NwYWNlIFsxXTsKCiAgICAvLyB7IHNpZ24sIHZhbHVlLCBub25lLCBzeW1ib2wgfQogICAgLy8gbmVnYXRpdmVfc2lnbiBpcyAiLSAiLCAobm90ZSB0aGUgc2luZ2xlIHRyYWlsaW5nIHNwYWNlKQogICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGV4dHJhY3Rpb24gc3VjZWVkcywgaS5lLiwgdGhhdCB0aGUgbW9uZXlfYmFzZTo6bm9uZQogICAgLy8gc3BlY2lmaWVyIHRoYXQncyBsYXN0IGluIHRoZSBwYXR0ZXJuIGRvZXNuJ3QgY29uZnVzZSB0aGUgZmFjZXQgaW50bwogICAgLy8gZXh0cmFjdGluZyBhbGwgdGhlIG9wdGlvbmFsIHdoaXRlc3BhY2UsIGxlYXZpbmcgbm9uZSB0byBjb21wbGV0ZQogICAgLy8gdGhlIG5lZ2F0aXZlX3NpZ24KICAgIFRFU1QgKFQsIC0xMDkuMSwgIi0xMDkgICIsIDYsIDAsIGVvZmJpdCwgMCwgIi0xQCQiLCAiIik7CgogICAgLy8gdmVyaWZ5IHRoYXQgb3B0aW9uYWwgc3BhY2UgYWZ0ZXIgdmFsdWUgYW5kIGJlZm9yZSBjdXJyZW5jeQogICAgLy8gc3ltYm9sIGlzIHRyZWF0ZWQgY29ycmVjdGx5CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbaW50bF0gPSBwbHVzX3BsdXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtpbnRsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwoKICAgIC8vIHsgc2lnbiwgdmFsdWUsIG5vbmUsIHN5bWJvbCB9CiAgICBURVNUIChULCAgMTA5MC4wLCAiMTA5MCAkIiwgICA2LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDEwOTEuMCwgIjEwOTEgJCIsICAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsICsxMDkyLjAsICIrMTA5MiAkKyIsIDgsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSBwYXJlbnMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKCiAgICBURVNUIChULCAgMTA5My4wLCAiMTA5MyAkIiwgICA2LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDEwOTQuMCwgIjEwOTQgJCIsICAgNiwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMDk1LjAsICIoMTA5NSAkKSIsIDgsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CgogICAgLy8gdmVyaWZ5IGEgc2luZ2xlLWNoYXIgc2lnbiB3aXRoIGEgbXVsdGljaGFyIG9uZSAoc2VlIGJ1ZyAjNDI4KQogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gcGx1cyBbMF07CiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbbG9jbF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gcGFyZW5zIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46Om5lZ2F0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CgogICAgLy8geyBzaWduLCB2YWx1ZSwgbm9uZSwgc3ltYm9sIH0KICAgIFRFU1QgKFQsICAxMDk2LjAsICIxMDk2ICQiLCAgIDYsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CiAgICBURVNUIChULCAgMTA5Ny4wLCAiMTA5NyAkIiwgICA2LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIi0xQCQiLCAiJCIpOwogICAgVEVTVCAoVCwgKzEwOTguMCwgIisxMDk4ICQiLCAgNywgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICItMUAkIiwgIiQiKTsKICAgIFRFU1QgKFQsIC0xMDk5LjAsICIoMTA5OSAkKSIsIDgsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiLTFAJCIsICIkIik7CgogICAgUHVuY3REYXRhPGNoYXJUPjo6cG9zaXRpdmVfc2lnbl8gW2ludGxdID0gMDsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IDA7CiAgICBQdW5jdERhdGE8Y2hhclQ+OjpuZWdhdGl2ZV9zaWduXyBbaW50bF0gPSAwOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gMDsKCiAgICAvLyB7IHZhbHVlLCBub25lLCBzeW1ib2wsIHNpZ24gfQogICAgLy8gdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyBub3QgZXh0cmFjdGVkIChldmVuIGlmIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQpCiAgICAvLyBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCB0aGF0IG5vIG90aGVyIGNoYXJhY3RlcnMgY2FuIHBvc3NpYmx5IGNvbXBsZXRlCiAgICAvLyB0aGUgZm9ybWF0IChlLmcuLCBpZiBib3RoIHNpZ25zIGFuZCBzeW1ib2wgYXJlIGVtcHR5IG9yIGlmIHNpZ25zIGFyZQogICAgLy8gZW1wdHkgYW5kIHN5bWJvbCBpcyBvcHRpb25hbCkKICAgIFRFU1QgKFQsICAxMTAuMCwgIjExMCAkIiwgIDMsIDAsICAgICAgICBnb29kYml0LCAwLCAiMUAtJCIsICIkIik7CiAgICBURVNUIChULCAgMTExLjAsICIxMTEgJCIsICAzLCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIjEgLSQiLCAiJCIpOwogICAgVEVTVCAoVCwgIDExMi4wLCAiMTEyJCIsICAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICIxQC0kIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMTMuMCwgIjExMyQiLCAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiMUAtJCIsICIkIik7CiAgICBURVNUIChULCAgMTE0LjAsICIxMTQgJCIsICA1LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIjEgLSQiLCAiJCIpOwoKICAgIFRFU1QgKFQsICAxMTUuMCwgIjExNSAkIiwgIDMsIDAsICAgICAgICBnb29kYml0LCAwLCAiMUAkLSIsICIkIik7CiAgICBURVNUIChULCAgMTE2LjAsICIxMTYgJCIsICAzLCAwLCAgICAgICAgZ29vZGJpdCwgMCwgIjEgJC0iLCAiJCIpOwogICAgVEVTVCAoVCwgIDExNy4wLCAiMTE3JCIsICAgNCwgc2hvd2Jhc2UsIGVvZmJpdCwgIDAsICIxQCQtIiwgIiQiKTsKICAgIFRFU1QgKFQsICAxMTguMCwgIjExOCQiLCAgIDQsIHNob3diYXNlLCBlb2ZiaXQsICAwLCAiMUAkLSIsICIkIik7CiAgICBURVNUIChULCAgMTE5LjAsICIxMTkgJCIsICA1LCBzaG93YmFzZSwgZW9mYml0LCAgMCwgIjEgJC0iLCAiJCIpOwoKCiAgICBQdW5jdERhdGE8Y2hhclQ+Ojpwb3NpdGl2ZV9zaWduXyBbaW50bF0gPSBwbHVzIFswXTsKICAgIFB1bmN0RGF0YTxjaGFyVD46OnBvc2l0aXZlX3NpZ25fIFtsb2NsXSA9IHBsdXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2ludGxdID0gbWludXMgWzBdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6bmVnYXRpdmVfc2lnbl8gW2xvY2xdID0gbWludXMgWzFdOwogICAgUHVuY3REYXRhPGNoYXJUPjo6dGhvdXNhbmRzX3NlcF8gW2ludGxdID0gJzsnOwogICAgUHVuY3REYXRhPGNoYXJUPjo6dGhvdXNhbmRzX3NlcF8gW2xvY2xdID0gJyonOwoKICAgIC8vIHRlc3QgZ3JvdXBpbmcsIGRlZmF1bHQgcGF0dGVybiB7IHN5bWJvbCBzaWduIG5vbmUgdmFsdWUgfQogICAgVEVTVCAoVCwgMC4wLCAiJDAiLCAgICAgMiwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDA7MCIsICAgNCwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDA7MDswIiwgNiwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIDAuMCwgIiQrMCIsICAgICAzLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkKzA7MCIsICAgNSwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJCswOzA7MCIsIDcsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAwLjAsICIkLTAuMCIsICAgICAgICA1LCAwLCBlb2ZiaXQsIDEsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkLTA7MC4wMCIsICAgICA4LCAwLCBlb2ZiaXQsIDIsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkLTA7MDswLjAwMCIsIDExLCAwLCBlb2ZiaXQsIDMsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgICAgIC0xMC4wLCAiJC0xLiIsICAgICAgICAgICA0LCAwLCBlb2ZiaXQsIDEsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAgIC0yMDAwLjAsICIkLTI7MC4wMDAwIiwgICAgMTAsIDAsIGVvZmJpdCwgMiwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIC0zMDAwMDAuMCwgIiQtMzswOzAuMDAwMDAiLCAxMywgMCwgZW9mYml0LCAzLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgLTMwMDAwMS4wLCAiJC0zOzA7MC4wMDEyMyIsIDEzLCAwLCBlb2ZiaXQsIDMsIDAsICIkIiwgIlwxIik7CgogICAgLy8gaW52YWxpZCBncm91cGluZzogc3RvcmUgdmFsdWUgYW5kIHNldCBmYWlsYml0CiAgICBURVNUIChULCAwLjAsICIkMDsiLCAgIDMsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkOzA7MCIsIDUsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkMDs7MCIsIDUsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkOy4wIiwgIDQsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDEsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkOzsuMCIsIDUsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDEsIDAsICIkIiwgIlwxIik7CiAgICAvLyBkZWNpbWFsX3BvaW50IGFsb25lIGlzIG5vdCBhIHZhbGlkIG51bWJlcgogICAgVEVTVCAoVCwgMC4wLCAiJC47MSIsICAyLCAwLCBmYWlsYml0LCAgICAgICAgICAxLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJDsuOzIiLCAzLCAwLCBmYWlsYml0LCAgICAgICAgICAxLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIDAuMCwgIiQrMDsiLCAgIDQsIDAsIGVvZmJpdCB8IGZhaWxiaXQsIDAsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAwLjAsICIkKzswOzAiLCA2LCAwLCBlb2ZiaXQgfCBmYWlsYml0LCAwLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgMC4wLCAiJCswOzswIiwgNiwgMCwgZW9mYml0IHwgZmFpbGJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIDAuMCwgIiQrOy4wOyIsIDUsIDAsIGZhaWxiaXQsICAgICAgICAgIDEsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgICAgIC00MC4wLCAiJC00Oy4gIiwgICAgICAgICAgIDUsIDAsIGZhaWxiaXQsIDEsIDAsICIkIiwgIlwxIik7CiAgICBURVNUIChULCAgIC01MDAwLjAsICIkLTs1OzAuMDAwMCAiLCAgICAxMSwgMCwgZmFpbGJpdCwgMiwgMCwgIiQiLCAiXDEiKTsKICAgIFRFU1QgKFQsIC02MDAwMDAuMCwgIiQtNjswOzswLjAwMDAwICIsIDE0LCAwLCBmYWlsYml0LCAzLCAwLCAiJCIsICJcMSIpOwogICAgVEVTVCAoVCwgLTcwMDAwNC4wLCAiJC03OzswOzAuMDA0NTYgIiwgMTQsIDAsIGZhaWxiaXQsIDMsIDAsICIkIiwgIlwxIik7CgojaWZuZGVmIF9SV1NURF9OT19MT05HX0RPVUJMRQojICBkZWZpbmUgTERCTCh4KSAgIHggIyMgTAojZWxzZQojICBkZWZpbmUgTERCTCh4KSAgIHgKI2VuZGlmCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjAsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQwOzE7MjszOzQ7NTs2Ozc7ODs5OzAiLCAyMiwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIExEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJDA7MDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjQsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQrMTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDIxLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkKzA7MTsyOzM7NDs1OzY7Nzs4Ozk7MCIsIDIzLCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwxIik7CgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkKzA7MDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjUsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCBMREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQrMDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjMsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAtTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkLTE7MjszOzQ7NTs2Ozc7ODs5OzAiLCAyMSwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMSIpOwoKICAgIFRFU1QgKFQsIC1MREJMICgxMjM0NTY3ODkwLjApLAogICAgICAgICAgIiQtMDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjMsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCiAgICBURVNUIChULCAtTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkLTA7MDsxOzI7Mzs0OzU7Njs3Ozg7OTswIiwgMjUsIDAsIGVvZmJpdCwgMCwgMCwgIiQiLCAiXDEiKTsKCgogICAgVEVTVCAoVCwgTERCTCAoMTIzNDU2Nzg5MC4wKSwKICAgICAgICAgICIkMTI7MzQ7NTY7Nzg7OTAiLCAxNSwgMCwgZW9mYml0LCAwLCAwLCAiJCIsICJcMiIpOwoKICAgIFRFU1QgKFQsIExEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJCsxMjszNDs1Njs3ODs5MCIsIDE2LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwyIik7CgogICAgVEVTVCAoVCwgLUxEQkwgKDEyMzQ1Njc4OTAuMCksCiAgICAgICAgICAiJC0xMjszNDs1Njs3ODs5MCIsIDE2LCAwLCBlb2ZiaXQsIDAsIDAsICIkIiwgIlwyIik7CgojdW5kZWYgVAoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgp2b2lkCnRlc3RfZ2V0IChjaGFyVCBvcHQsIGNvbnN0IGNoYXIgKmNuYW1lLCBjb25zdCBjaGFyICp0bmFtZSkKewogICAgLy8gdGVzdCBsb2NhbCBtb25leSBmb3JtYXQKICAgIHRlc3RfZ2V0IChvcHQsIGNuYW1lLCB0bmFtZSwgZmFsc2UpOwoKICAgIC8vIHRlc3QgaW50ZXJuYXRpb25hbCBtb25leSBmb3JtYXQKICAgIHRlc3RfZ2V0IChvcHQsIGNuYW1lLCB0bmFtZSwgdHJ1ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVD4Kdm9pZAp0ZXN0X2xvbmdfZG91YmxlIChjaGFyVCwgY29uc3QgY2hhciAqY25hbWUpCnsKICAgIGlmIChyd19lbmFibGVkICgibG9uZyBkb3VibGUiKSkKICAgICAgICB0ZXN0X2dldCAoY2hhclQgKDAgLyogbG9uZyBkb3VibGUgYXJndW1lbnQgKi8pLAogICAgICAgICAgICAgICAgICBjbmFtZSwgImxvbmcgZG91YmxlIik7CiAgICBlbHNlCiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLCAibG9uZyBkb3VibGUgdGVzdCBkaXNhYmxlZCIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQ+CnZvaWQKdGVzdF9zdHJpbmcgKGNoYXJULCBjb25zdCBjaGFyICpjbmFtZSkKewogICAgaWYgKHJ3X2VuYWJsZWQgKCJiYXNpY19zdHJpbmciKSkKICAgICAgICB0ZXN0X2dldCAoY2hhclQgKDEgLyogYmFzaWNfc3RyaW5nIGFyZ3VtZW50ICovKSwKICAgICAgICAgICAgICAgICAgY25hbWUsICJiYXNpY19zdHJpbmciKTsKICAgIGVsc2UKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sCiAgICAgICAgICAgICAgICAgImJhc2ljX3N0cmluZzwlcz4gdGVzdCBkaXNhYmxlZCIsIGNuYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludApydW5fdGVzdCAoaW50LCBjaGFyKltdKQp7CiAgICAvLyBjaGVjayB0aGUgcHJlc2NyaWJlZCB2YWx1ZXMgb2YgdGhlIHJlcXVpcmVkIGNvbnN0YW50cwogICAgcndfZmF0YWwgKCdcMCcgPT0gc3RkOjptb25leV9iYXNlOjpub25lLCAwLCAwLAogICAgICAgICAgICAgICInXFwwJyA9PSBtb25leV9iYXNlOjpub25lLCBnb3QgJWQiLCBzdGQ6Om1vbmV5X2Jhc2U6Om5vbmUpOwoKICAgIHJ3X2ZhdGFsICgnXDEnID09IHN0ZDo6bW9uZXlfYmFzZTo6c3BhY2UsIDAsIDAsCiAgICAgICAgICAgICAgIidcXDEnID09IG1vbmV5X2Jhc2U6OnNwYWNlLCBnb3QgJWQiLCBzdGQ6Om1vbmV5X2Jhc2U6OnNwYWNlKTsKCiAgICByd19mYXRhbCAoJ1wyJyA9PSBzdGQ6Om1vbmV5X2Jhc2U6OnN5bWJvbCwgMCwgMCwKICAgICAgICAgICAgICAiJ1xcMicgPT0gbW9uZXlfYmFzZTo6c3ltYm9sLCBnb3QgJWQiLCBzdGQ6Om1vbmV5X2Jhc2U6OnN5bWJvbCk7CgogICAgcndfZmF0YWwgKCdcMycgPT0gc3RkOjptb25leV9iYXNlOjpzaWduLCAwLCAwLAogICAgICAgICAgICAgICInXFwzJyA9PSBtb25leV9iYXNlOjpzaWduLCBnb3QgJWQiLCBzdGQ6Om1vbmV5X2Jhc2U6OnNpZ24pOwoKICAgIHJ3X2ZhdGFsICgnXDQnID09IHN0ZDo6bW9uZXlfYmFzZTo6dmFsdWUsIDAsIDAsCiAgICAgICAgICAgICAgIidcXDQnID09IG1vbmV5X2Jhc2U6OnZhbHVlLCBnb3QgJWQiLCBzdGQ6Om1vbmV5X2Jhc2U6OnZhbHVlKTsKICAgICAgICAgICAgICAgCiAgICBpZiAocndfZW5hYmxlZCAoImNoYXIiKSkgewogICAgICAgIHRlc3RfbG9uZ19kb3VibGUgKGNoYXIgKCksICJjaGFyIik7CiAgICAgICAgdGVzdF9zdHJpbmcgKGNoYXIgKCksICJjaGFyIik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLCAiY2hhciB0ZXN0IGRpc2FibGVkIik7CgojaWZuZGVmIF9SV1NURF9OT19XQ0hBUl9UCgogICAgaWYgKHJ3X2VuYWJsZWQgKCJ3Y2hhcl90IikpIHsKICAgICAgICB0ZXN0X2xvbmdfZG91YmxlICh3Y2hhcl90ICgpLCAid2NoYXJfdCIpOwogICAgICAgIHRlc3Rfc3RyaW5nICh3Y2hhcl90ICgpLCAid2NoYXJfdCIpOwogICAgfQogICAgZWxzZQogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgIndjaGFyX3QgdGVzdCBkaXNhYmxlZCIpOwoKI2VuZGlmICAgLy8gX1JXU1REX05PX1dDSEFSX1QKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50IG1haW4gKGludCBhcmdjLCBjaGFyKiBhcmd2IFtdKQp7CiAgICByZXR1cm4gcndfdGVzdCAoYXJnYywgYXJndiwgX19GSUxFX18sCiAgICAgICAgICAgICAgICAgICAgImxpYi5sb2NhbGUubW9uZXkuZ2V0IiwKICAgICAgICAgICAgICAgICAgICAwIC8qIG5vIGNvbW1lbnQgKi8sIHJ1bl90ZXN0LAogICAgICAgICAgICAgICAgICAgICJ8LW5vLWJhc2ljX3N0cmluZyMiLAogICAgICAgICAgICAgICAgICAgICZub19iYXNpY19zdHJpbmcpOwp9Cg==