I2luY2x1ZGUgImxvY2FsZV90ZXN0LmgiCgojaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQojICBpbmNsdWRlIDxsb2NhbGU+CiMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KCiMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkKF9TVExQX1VTRV9OQU1FU1BBQ0VTKQp1c2luZyBuYW1lc3BhY2Ugc3RkOwojICBlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIqIHRlc3RlZF9sb2NhbGVzW10gPSB7Ci8vbmFtZSwKIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQogIC8vIFdlIG5lZWQgZXhjZXB0aW9uIHN1cHBvcnQgdG8gY2hlY2sgc3VwcG9ydCBvZiB0aGUgZm9sbG93aW5nIGxvY2FsaXphdGlvbnMuCiAgImZyX0ZSIiwKICAicnVfUlUua29pOHIiLAogICJlbl9HQiIsCiAgImVuX1VTIiwKIyAgZW5kaWYKICAiIiwKICAiQyIKfTsKCi8vCi8vIHRlc3RzIGltcGxlbWVudGF0aW9uCi8vCnZvaWQgTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0KCBjb25zdCBsb2NhbGUmIGxvYykKewogIENQUFVOSVRfQVNTRVJUKCBoYXNfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpICk7CiAgY3R5cGU8Y2hhcj4gY29uc3QmIGN0ID0gdXNlX2ZhY2V0PGN0eXBlPGNoYXI+ID4obG9jKTsKICAvL2lzCiAgewogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCAnMCcpICk7CiAgICBDUFBVTklUX0FTU0VSVCggY3QuaXMoY3R5cGVfYmFzZTo6dXBwZXIsICdBJykgKTsKICAgIENQUFVOSVRfQVNTRVJUKCBjdC5pcyhjdHlwZV9iYXNlOjpsb3dlciwgJ2EnKSApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCAnQScpICk7CiAgICBDUFBVTklUX0FTU0VSVCggY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICcgJykgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAhY3QuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICcyJykgKTsKICAgIENQUFVOSVRfQVNTRVJUKCBjdC5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgJy4nKSApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6OnhkaWdpdCwgJ2EnKSApOwogIH0KCiAgLy9pcyByYW5nZQogIHsKICAgIGNoYXIgdmFsdWVzW10gPSAiMEFhIC4iOwogICAgY3R5cGVfYmFzZTo6bWFzayByZXNbc2l6ZW9mKHZhbHVlcyldOwogICAgY3QuaXModmFsdWVzLCB2YWx1ZXMgKyBzaXplb2YodmFsdWVzKSwgcmVzKTsKICAgIC8vICcwJwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMF0gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMF0gJiBjdHlwZV9iYXNlOjpkaWdpdCkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMF0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKICAgIC8vICdBJwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMV0gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMV0gJiBjdHlwZV9iYXNlOjphbHBoYSkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMV0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6dXBwZXIpICE9IDAgKTsKICAgIC8vICdhJwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMl0gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMl0gJiBjdHlwZV9iYXNlOjphbHBoYSkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbMl0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzJdICYgY3R5cGVfYmFzZTo6bG93ZXIpICE9IDAgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAocmVzWzJdICYgY3R5cGVfYmFzZTo6c3BhY2UpID09IDAgKTsKICAgIC8vICcgJwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbM10gJiBjdHlwZV9iYXNlOjpwcmludCkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbM10gJiBjdHlwZV9iYXNlOjpzcGFjZSkgIT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIChyZXNbM10gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOwogICAgLy8gJy4nCiAgICBDUFBVTklUX0FTU0VSVCggKHJlc1s0XSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CiAgICBDUFBVTklUX0FTU0VSVCggKHJlc1s0XSAmIGN0eXBlX2Jhc2U6OnB1bmN0KSAhPSAwICk7CiAgICBDUFBVTklUX0FTU0VSVCggKHJlc1s0XSAmIGN0eXBlX2Jhc2U6OmRpZ2l0KSA9PSAwICk7CiAgfQoKICAvL3NjYW5faXMKICB7CiAgICBjaGFyIHJhbmdlW10gPSAiYWJBYzEyMyAuIjsKICAgIGNvbnN0IGNoYXIgKnJiZWcgPSByYW5nZTsKICAgIGNvbnN0IGNoYXIgKnJlbmQgPSByYW5nZSArIHNpemVvZihyYW5nZSk7CgogICAgY29uc3QgY2hhciAqcmVzOwogICAgcmVzID0gY3Quc2Nhbl9pcygoY3R5cGVfYmFzZTo6bWFzaykoY3R5cGVfYmFzZTo6YWxwaGEgfCBjdHlwZV9iYXNlOjpsb3dlciksIHJiZWcsIHJlbmQpOwogICAgQ1BQVU5JVF9BU1NFUlQoIHJlcyAhPSByZW5kICk7CiAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnYScgKTsKCiAgICByZXMgPSBjdC5zY2FuX2lzKGN0eXBlX2Jhc2U6OnVwcGVyLCByYmVnLCByZW5kKTsKICAgIENQUFVOSVRfQVNTRVJUKCByZXMgIT0gcmVuZCApOwogICAgQ1BQVU5JVF9BU1NFUlQoICpyZXMgPT0gJ0EnICk7CgogICAgcmVzID0gY3Quc2Nhbl9pcyhjdHlwZV9iYXNlOjpwdW5jdCwgcmJlZywgcmVuZCk7CiAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAqcmVzID09ICcuJyApOwogIH0KCiAgLy9zY2FuX25vdAogIHsKICAgIGNoYXIgcmFuZ2VbXSA9ICJhYkFjMTIzIC4iOwogICAgY29uc3QgY2hhciAqcmJlZyA9IHJhbmdlOwogICAgY29uc3QgY2hhciAqcmVuZCA9IHJhbmdlICsgc2l6ZW9mKHJhbmdlKTsKCiAgICBjb25zdCBjaGFyICpyZXM7CiAgICByZXMgPSBjdC5zY2FuX25vdCgoY3R5cGVfYmFzZTo6bWFzaykoY3R5cGVfYmFzZTo6YWxwaGEgfCBjdHlwZV9iYXNlOjpsb3dlciksIHJiZWcsIHJlbmQpOwogICAgQ1BQVU5JVF9BU1NFUlQoIHJlcyAhPSByZW5kICk7CiAgICBDUFBVTklUX0FTU0VSVCggKnJlcyA9PSAnMScgKTsKCiAgICByZXMgPSBjdC5zY2FuX25vdChjdHlwZV9iYXNlOjphbHBoYSwgcmJlZywgcmVuZCk7CiAgICBDUFBVTklUX0FTU0VSVCggcmVzICE9IHJlbmQgKTsKICAgIENQUFVOSVRfQVNTRVJUKCAqcmVzID09ICcxJyApOwoKICAgIHJlcyA9IGN0LnNjYW5fbm90KGN0eXBlX2Jhc2U6OnB1bmN0LCByYmVnLCByZW5kKTsKICAgIENQUFVOSVRfQVNTRVJUKCByZXMgIT0gcmVuZCApOwogICAgQ1BQVU5JVF9BU1NFUlQoICpyZXMgPT0gJ2EnICk7CiAgfQoKICAvL3RvdXBwZXIKICB7CiAgICBDUFBVTklUX0FTU0VSVCggY3QudG91cHBlcignYScpID09ICdBJyApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LnRvdXBwZXIoJ0EnKSA9PSAnQScgKTsKICAgIENQUFVOSVRfQVNTRVJUKCBjdC50b3VwcGVyKCcxJykgPT0gJzEnICk7CiAgfQoKICAvL3RvdXBwZXIgcmFuZ2UKICB7CiAgICBjaGFyIHJhbmdlW10gPSAiYWJBYzEiOwogICAgY2hhciBleHBlY3RlZF9yYW5nZVtdID0gIkFCQUMxIjsKICAgIGN0LnRvdXBwZXIocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSk7CiAgICBDUFBVTklUX0FTU0VSVCggZXF1YWwocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgZXhwZWN0ZWRfcmFuZ2UpICk7CiAgfQoKICAvL3RvbG93ZXIKICB7CiAgICBDUFBVTklUX0FTU0VSVCggY3QudG9sb3dlcignQScpID09ICdhJyApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LnRvbG93ZXIoJ2EnKSA9PSAnYScgKTsKICAgIENQUFVOSVRfQVNTRVJUKCBjdC50b2xvd2VyKCcxJykgPT0gJzEnICk7CiAgfQoKICAvL3RvbG93ZXIgcmFuZ2UKICB7CiAgICBjaGFyIHJhbmdlW10gPSAiQUJhQzEiOwogICAgY2hhciBleHBlY3RlZF9yYW5nZVtdID0gImFiYWMxIjsKICAgIGN0LnRvbG93ZXIocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSk7CiAgICBDUFBVTklUX0FTU0VSVCggZXF1YWwocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgZXhwZWN0ZWRfcmFuZ2UpICk7CiAgfQoKICAvL3dpZGVuCiAgewogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LndpZGVuKCdhJykgPT0gJ2EnICk7CiAgfQoKICAvL3dpZGVuIHJhbmdlCiAgewogICAgY2hhciByYW5nZVtdID0gIkFCYUMxIjsKICAgIGNoYXIgcmVzW3NpemVvZihyYW5nZSldOwogICAgY3Qud2lkZW4ocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgcmVzKTsKICAgIENQUFVOSVRfQVNTRVJUKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpLCByZXMpICk7CiAgfQoKICAvL25hcnJvdwogIHsKICAgIENQUFVOSVRfQVNTRVJUKCBjdC5uYXJyb3coJ2EnLCAnYicpID09ICdhJyApOwogIH0KCiAgLy9uYXJyb3cgcmFuZ2UKICB7CiAgICBjaGFyIHJhbmdlW10gPSAiQUJhQzEiOwogICAgY2hhciByZXNbc2l6ZW9mKHJhbmdlKV07CiAgICBjdC5uYXJyb3cocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgJ2InLCByZXMpOwogICAgQ1BQVU5JVF9BU1NFUlQoIGVxdWFsKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSksIHJlcykgKTsKICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0X3coIGNvbnN0IGxvY2FsZSYgbG9jICkKewojIGlmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCiAgQ1BQVU5JVF9BU1NFUlQoIGhhc19mYWNldDxjdHlwZTx3Y2hhcl90PiA+KGxvYykgKTsKICBjdHlwZTx3Y2hhcl90PiBjb25zdCYgd2N0ID0gdXNlX2ZhY2V0PGN0eXBlPHdjaGFyX3Q+ID4obG9jKTsKICAvL2lzCiAgewogICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBMJzAnKSApOwogICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBMJ0EnKSApOwogICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBMJ2EnKSApOwogICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBMJ0EnKSApOwogICAgQ1BQVU5JVF9DSEVDSyggd2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBMJyAnKSApOwogICAgQ1BQVU5JVF9DSEVDSyggIXdjdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgTCcyJykgKTsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgTCcuJykgKTsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIEwnYScpICk7CiAgfQoKICAvL2lzIHJhbmdlCiAgewogICAgd2NoYXJfdCB2YWx1ZXNbXSA9IEwiMEFhIC4iOwogICAgY3R5cGVfYmFzZTo6bWFzayByZXNbc2l6ZW9mKHZhbHVlcykgLyBzaXplb2Yod2NoYXJfdCldOwogICAgd2N0LmlzKHZhbHVlcywgdmFsdWVzICsgKHNpemVvZih2YWx1ZXMpIC8gc2l6ZW9mKHdjaGFyX3QpKSwgcmVzKTsKICAgIC8vICcwJwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1swXSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzBdICYgY3R5cGVfYmFzZTo6ZGlnaXQpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMF0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKICAgIC8vICdBJwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1sxXSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzFdICYgY3R5cGVfYmFzZTo6YWxwaGEpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMV0gJiBjdHlwZV9iYXNlOjp4ZGlnaXQpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMV0gJiBjdHlwZV9iYXNlOjp1cHBlcikgIT0gMCApOwogICAgLy8gJ2EnCiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzJdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbMl0gJiBjdHlwZV9iYXNlOjphbHBoYSkgIT0gMCApOwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1syXSAmIGN0eXBlX2Jhc2U6OnhkaWdpdCkgIT0gMCApOwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1syXSAmIGN0eXBlX2Jhc2U6Omxvd2VyKSAhPSAwICk7CiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzJdICYgY3R5cGVfYmFzZTo6c3BhY2UpID09IDAgKTsKICAgIC8vICcgJwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1szXSAmIGN0eXBlX2Jhc2U6OnByaW50KSAhPSAwICk7CiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzNdICYgY3R5cGVfYmFzZTo6c3BhY2UpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbM10gJiBjdHlwZV9iYXNlOjpkaWdpdCkgPT0gMCApOwogICAgLy8gJy4nCiAgICBDUFBVTklUX0NIRUNLKCAocmVzWzRdICYgY3R5cGVfYmFzZTo6cHJpbnQpICE9IDAgKTsKICAgIENQUFVOSVRfQ0hFQ0soIChyZXNbNF0gJiBjdHlwZV9iYXNlOjpwdW5jdCkgIT0gMCApOwogICAgQ1BQVU5JVF9DSEVDSyggKHJlc1s0XSAmIGN0eXBlX2Jhc2U6OmRpZ2l0KSA9PSAwICk7CiAgfQoKICAvL3NjYW5faXMKICB7CiAgICB3Y2hhcl90IHJhbmdlW10gPSBMImFiQWMxMjMgLiI7CiAgICBjb25zdCB3Y2hhcl90ICpyYmVnID0gcmFuZ2U7CiAgICBjb25zdCB3Y2hhcl90ICpyZW5kID0gcmFuZ2UgKyAoc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSk7CgogICAgY29uc3Qgd2NoYXJfdCAqcmVzOwogICAgcmVzID0gd2N0LnNjYW5faXMoKGN0eXBlX2Jhc2U6Om1hc2spKGN0eXBlX2Jhc2U6OmFscGhhIHwgY3R5cGVfYmFzZTo6bG93ZXIpLCByYmVnLCByZW5kKTsKICAgIENQUFVOSVRfQ0hFQ0soIHJlcyAhPSByZW5kICk7CiAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnYScgKTsKCiAgICByZXMgPSB3Y3Quc2Nhbl9pcyhjdHlwZV9iYXNlOjp1cHBlciwgcmJlZywgcmVuZCk7CiAgICBDUFBVTklUX0NIRUNLKCByZXMgIT0gcmVuZCApOwogICAgQ1BQVU5JVF9DSEVDSyggKnJlcyA9PSBMJ0EnICk7CgogICAgcmVzID0gd2N0LnNjYW5faXMoY3R5cGVfYmFzZTo6cHVuY3QsIHJiZWcsIHJlbmQpOwogICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKICAgIENQUFVOSVRfQ0hFQ0soICpyZXMgPT0gTCcuJyApOwogIH0KCiAgLy9zY2FuX25vdAogIHsKICAgIHdjaGFyX3QgcmFuZ2VbXSA9IEwiYWJBYzEyMyAuIjsKICAgIGNvbnN0IHdjaGFyX3QgKnJiZWcgPSByYW5nZTsKICAgIGNvbnN0IHdjaGFyX3QgKnJlbmQgPSByYW5nZSArIChzaXplb2YocmFuZ2UpIC8gc2l6ZW9mKHdjaGFyX3QpKTsKCiAgICBjb25zdCB3Y2hhcl90ICpyZXM7CiAgICByZXMgPSB3Y3Quc2Nhbl9ub3QoKGN0eXBlX2Jhc2U6Om1hc2spKGN0eXBlX2Jhc2U6OmFscGhhIHwgY3R5cGVfYmFzZTo6bG93ZXIpLCByYmVnLCByZW5kKTsKICAgIENQUFVOSVRfQ0hFQ0soIHJlcyAhPSByZW5kICk7CiAgICBDUFBVTklUX0NIRUNLKCAqcmVzID09IEwnMScgKTsKCiAgICByZXMgPSB3Y3Quc2Nhbl9ub3QoY3R5cGVfYmFzZTo6YWxwaGEsIHJiZWcsIHJlbmQpOwogICAgQ1BQVU5JVF9DSEVDSyggcmVzICE9IHJlbmQgKTsKICAgIENQUFVOSVRfQ0hFQ0soICpyZXMgPT0gTCcxJyApOwoKICAgIHJlcyA9IHdjdC5zY2FuX25vdChjdHlwZV9iYXNlOjpwdW5jdCwgcmJlZywgcmVuZCk7CiAgICBDUFBVTklUX0NIRUNLKCByZXMgIT0gcmVuZCApOwogICAgQ1BQVU5JVF9DSEVDSyggKnJlcyA9PSBMJ2EnICk7CiAgfQoKICAvL3RvdXBwZXIKICB7CiAgICBDUFBVTklUX0NIRUNLKCB3Y3QudG91cHBlcihMJ2EnKSA9PSBMJ0EnICk7CiAgICBDUFBVTklUX0NIRUNLKCB3Y3QudG91cHBlcihMJ0EnKSA9PSBMJ0EnICk7CiAgICBDUFBVTklUX0NIRUNLKCB3Y3QudG91cHBlcihMJzEnKSA9PSBMJzEnICk7CiAgfQoKICAvL3RvdXBwZXIgcmFuZ2UKICB7CiAgICB3Y2hhcl90IHJhbmdlW10gPSBMImFiQWMxIjsKICAgIHdjaGFyX3QgZXhwZWN0ZWRfcmFuZ2VbXSA9IEwiQUJBQzEiOwogICAgd2N0LnRvdXBwZXIocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSk7CiAgICBDUFBVTklUX0NIRUNLKCBlcXVhbChyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpIC8gc2l6ZW9mKHdjaGFyX3QpLCBleHBlY3RlZF9yYW5nZSkgKTsKICB9CgogIC8vdG9sb3dlcgogIHsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC50b2xvd2VyKEwnQScpID09IEwnYScgKTsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC50b2xvd2VyKEwnYScpID09IEwnYScgKTsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC50b2xvd2VyKEwnMScpID09IEwnMScgKTsKICB9CgogIC8vdG9sb3dlciByYW5nZQogIHsKICAgIHdjaGFyX3QgcmFuZ2VbXSA9IEwiQUJhQzEiOwogICAgd2NoYXJfdCBleHBlY3RlZF9yYW5nZVtdID0gTCJhYmFjMSI7CiAgICB3Y3QudG9sb3dlcihyYW5nZSwgcmFuZ2UgKyBzaXplb2YocmFuZ2UpIC8gc2l6ZW9mKHdjaGFyX3QpKTsKICAgIENQUFVOSVRfQ0hFQ0soIGVxdWFsKHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCksIGV4cGVjdGVkX3JhbmdlKSApOwogIH0KCiAgLy93aWRlbgogIHsKICAgIENQUFVOSVRfQ0hFQ0soIHdjdC53aWRlbignYScpID09IEwnYScgKTsKICB9CgogIC8vd2lkZW4gcmFuZ2UKICB7CiAgICBjaGFyIHJhbmdlW10gPSAiQUJhQzEiOwogICAgd2NoYXJfdCByZXNbc2l6ZW9mKHJhbmdlKV07CiAgICB3Y2hhcl90IGV4cGVjdGVkX3Jlc1tdID0gTCJBQmFDMSI7CiAgICB3Y3Qud2lkZW4ocmFuZ2UsIHJhbmdlICsgc2l6ZW9mKHJhbmdlKSwgcmVzKTsKICAgIENQUFVOSVRfQ0hFQ0soIGVxdWFsKGV4cGVjdGVkX3JlcywgZXhwZWN0ZWRfcmVzICsgc2l6ZW9mKHJhbmdlKSwgcmVzKSApOwogIH0KCiAgLy9uYXJyb3cKICB7CiAgICBDUFBVTklUX0NIRUNLKCB3Y3QubmFycm93KEwnYScsICdiJykgPT0gTCdhJyApOwogIH0KCiAgLy9uYXJyb3cgcmFuZ2UKICB7CiAgICB3Y2hhcl90IHJhbmdlW10gPSBMIkFCYUMxIjsKICAgIGNoYXIgcmVzW3NpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCldOwogICAgY2hhciBleHBlY3RlZF9yZXNbXSA9ICJBQmFDMSI7CiAgICB3Y3QubmFycm93KHJhbmdlLCByYW5nZSArIHNpemVvZihyYW5nZSkgLyBzaXplb2Yod2NoYXJfdCksICdiJywgcmVzKTsKICAgIENQUFVOSVRfQ0hFQ0soIGVxdWFsKGV4cGVjdGVkX3JlcywgZXhwZWN0ZWRfcmVzICsgc2l6ZW9mKHJhbmdlKSAvIHNpemVvZih3Y2hhcl90KSwgcmVzKSApOwogIH0KIyBlbmRpZgp9CgoKdHlwZWRlZiB2b2lkIChMb2NhbGVUZXN0OjoqX1Rlc3QpIChjb25zdCBsb2NhbGUmKTsKc3RhdGljIHZvaWQgdGVzdF9zdXBwb3J0ZWRfbG9jYWxlKExvY2FsZVRlc3QmIGluc3QsIF9UZXN0IF9fdGVzdCkgewogIHNpemVfdCBuID0gc2l6ZW9mKHRlc3RlZF9sb2NhbGVzKSAvIHNpemVvZih0ZXN0ZWRfbG9jYWxlc1swXSk7CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGxvY2FsZSBsb2M7CiMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKICAgIHRyeQojICBlbmRpZgogICAgewogICAgICBsb2NhbGUgdG1wKHRlc3RlZF9sb2NhbGVzW2ldKTsKICAgICAgbG9jID0gdG1wOwogICAgfQojICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCiAgICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKICAgICAgLy9UaGlzIGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICBjb250aW51ZTsKICAgIH0KIyAgZW5kaWYKCiAgICBDUFBVTklUX01FU1NBR0UoIGxvYy5uYW1lKCkuY19zdHIoKSApOwogICAgKGluc3QuKl9fdGVzdCkobG9jKTsKCiAgICB7CiAgICAgIGxvY2FsZSB0bXAobG9jYWxlOjpjbGFzc2ljKCksIHRlc3RlZF9sb2NhbGVzW2ldLCBsb2NhbGU6OmN0eXBlKTsKICAgICAgbG9jID0gdG1wOwogICAgfQogICAgKGluc3QuKl9fdGVzdCkobG9jKTsKCiAgICB7CiAgICAgIGxvY2FsZSB0bXAobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjdHlwZV9ieW5hbWU8Y2hhcj4odGVzdGVkX2xvY2FsZXNbaV0pKTsKI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCiAgICAgIGxvY2FsZSB0bXAwKHRtcCwgbmV3IGN0eXBlX2J5bmFtZTx3Y2hhcl90Pih0ZXN0ZWRfbG9jYWxlc1tpXSkpOwogICAgICB0bXAgPSB0bXAwOwojZW5kaWYKICAgICAgbG9jID0gdG1wOwogICAgfQogICAgKGluc3QuKl9fdGVzdCkobG9jKTsKICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6Y3R5cGVfZmFjZXQoKQp7CiAgdGVzdF9zdXBwb3J0ZWRfbG9jYWxlKCp0aGlzLCAmTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0KTsKI2lmbmRlZiBfU1RMUF9OT19XQ0hBUl9UCiAgdGVzdF9zdXBwb3J0ZWRfbG9jYWxlKCp0aGlzLCAmTG9jYWxlVGVzdDo6X2N0eXBlX2ZhY2V0X3cpOwojZW5kaWYKfQoKdm9pZCBMb2NhbGVUZXN0OjpjdHlwZV9ieV9uYW1lKCkKewogIC8qCiAgICogQ2hlY2sgb2YgdGhlIDIyLjEuMS4yLjcgc3RhbmRhcmQgcG9pbnQuIENvbnN0cnVjdGlvbiBvZiBhIGxvY2FsZQogICAqIGluc3RhbmNlIGZyb20gYSBudWxsIHBvaW50ZXIgb3IgYW4gdW5rbm93biBuYW1lIHNob3VsZCByZXN1bHQgaW4KICAgKiBhIHJ1bnRpbWVfZXJyb3IgZXhjZXB0aW9uLgogICAqLwojICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZCAoX1NUTFBfVVNFX0VYQ0VQVElPTlMpCiMgICAgaWYgIGRlZmluZWQgKFNUTFBPUlQpIHx8ICghZGVmaW5lZChfX0dOVUNfXykgJiYgKCFkZWZpbmVkIChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSID4gMTQwMCkpKQogICAvLyBsaWJzdGRjKysgY2FsbCBmcmVlbG9jYXRlIG9uIGJhZCBsb2NhbGUKICB0cnkgewogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGN0eXBlX2J5bmFtZTxjaGFyPihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oMCkpKTsKICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfQVNTRVJUKCBmYWxzZSApOwogIH0KIyAgICBlbmRpZgoKICB0cnkgewogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGN0eXBlX2J5bmFtZTxjaGFyPigieWFzbGlfbGFuZ3VhZ2UiKSk7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQogIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CiAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KCiMgICAgaWYgIGRlZmluZWQoU1RMUE9SVCkgfHwgIWRlZmluZWQoX19HTlVDX18pCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+KHN0YXRpY19jYXN0PGNoYXIgY29uc3QqPigwKSkpOwogICAgQ1BQVU5JVF9GQUlMOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CiMgICAgZW5kaWYKCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2RlY3Z0X2J5bmFtZTxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKICAgIC8vU1RMcG9ydCBpbXBsZW1lbnRhdGlvbiBkbyBub3QgY2FyZSBhYm91dCBuYW1lIHBhc3MgdG8gdGhpcyBmYWNldC4KIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkKICAgIENQUFVOSVRfRkFJTDsKIyAgICBlbmRpZgogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CgogIHRyeSB7CiAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY3R5cGVfYnluYW1lPGNoYXI+KCJmcl9GUiIpKTsKICAgIENQUFVOSVRfQVNTRVJUKCBoYXNfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpICk7CiAgICBjdHlwZTxjaGFyPiBjb25zdCYgY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpOwogICAgQ1BQVU5JVF9BU1NFUlQoIGN0LmlzKGN0eXBlX2Jhc2U6Om1hc2soY3R5cGVfYmFzZTo6cHJpbnQgfCBjdHlwZV9iYXNlOjpsb3dlciB8IGN0eXBlX2Jhc2U6OmFscGhhKSwgJ+cnKSApOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CgogIHRyeSB7CiAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY3R5cGVfYnluYW1lPGNoYXI+KCJDIikpOwogICAgY3R5cGU8Y2hhcj4gY29uc3QmIGNmYWNldF9ieW5hbWUgPSB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihsb2MpOwogICAgY3R5cGU8Y2hhcj4gY29uc3QmIGNmYWNldCA9IHVzZV9mYWNldDxjdHlwZTxjaGFyPiA+KGxvY2FsZTo6Y2xhc3NpYygpKTsKCiAgICBmb3IgKGNoYXIgYyA9IDA7OyArK2MpIHsKICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6c3BhY2UsIGMpKTsKICAgICAgaWYgKGNmYWNldF9ieW5hbWUuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIGMpICE9IGNmYWNldC5pcyhjdHlwZV9iYXNlOjpwcmludCwgYykpCiAgICAgIHsKICAgICAgICBDUFBVTklUX0NIRUNLKGNmYWNldF9ieW5hbWUuaXMoY3R5cGVfYmFzZTo6cHJpbnQsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjpwcmludCwgYykpOwogICAgICB9CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmNudHJsLCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6Omxvd2VyLCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmFscGhhLCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OmRpZ2l0LCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgYykgPT0gY2ZhY2V0LmlzKGN0eXBlX2Jhc2U6OnB1bmN0LCBjKSk7CiAgICAgIENQUFVOSVRfQ0hFQ0soY2ZhY2V0X2J5bmFtZS5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIGMpID09IGNmYWNldC5pcyhjdHlwZV9iYXNlOjp4ZGlnaXQsIGMpKTsKICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6OmFsbnVtLCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6YWxudW0sIGMpKTsKICAgICAgQ1BQVU5JVF9DSEVDSyhjZmFjZXRfYnluYW1lLmlzKGN0eXBlX2Jhc2U6OmdyYXBoLCBjKSA9PSBjZmFjZXQuaXMoY3R5cGVfYmFzZTo6Z3JhcGgsIGMpKTsKICAgICAgaWYgKGMgPT0gMTI3KSBicmVhazsKICAgIH0KICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKICAgIC8qIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsgKi8KICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KCiMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQojICAgICAgaWYgIGRlZmluZWQoU1RMUE9SVCkgfHwgIWRlZmluZWQoX19HTlVDX18pCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjdHlwZV9ieW5hbWU8d2NoYXJfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQogIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JikgewogIH0KICBjYXRjaCAoLi4uKSB7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQojICAgICAgZW5kaWYKCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjdHlwZV9ieW5hbWU8d2NoYXJfdD4oInlhc2xpX2xhbmd1YWdlIikpOwogICAgQ1BQVU5JVF9GQUlMOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYpIHsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KCiMgICAgICBpZiAgZGVmaW5lZChTVExQT1JUKSB8fCAhZGVmaW5lZChfX0dOVUNfXykKICB0cnkgewogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KDApKSk7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQogIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CiAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KIyAgICAgIGVuZGlmCgogIHRyeSB7CiAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29kZWN2dF9ieW5hbWU8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PigieWFzbGlfbGFuZ3VhZ2UiKSk7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQogIGNhdGNoIChydW50aW1lX2Vycm9yIGNvbnN0JiAvKiBlICovKSB7CiAgICAvL0NQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KIyAgICBlbmRpZgojICBlbmRpZgp9CgojZW5kaWYK