JW1vZHVsZSAiZW51bV90aG9yb3VnaCIKCi8vIFN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgUnVieSBtb2R1bGUgZm9yIGFsbCBvZiB0aGUKLy8gZm9sbG93aW5nLi4uCgojcHJhZ21hIFNXSUcgbm93YXJuPVNXSUdXQVJOX1BBUlNFX0tFWVdPUkQKCiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSk7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgcmVkOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGJsdWU7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZ3JlZW47CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgU3BlZWRDbGFzczo6c2xvdzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBTcGVlZENsYXNzOjptZWRpdW07CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgU3BlZWRDbGFzczo6ZmFzdDsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBTcGVlZENsYXNzOjpsaWdodG5pbmc7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVGVtcGxhdGVDbGFzczo6ZWluc3RlaW47CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVGVtcGxhdGVDbGFzczo6Z2FsaWxlbzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBOYW1lOjpUQ2xhc3M6OmZhcmFkYXk7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgTmFtZTo6VENsYXNzOjpiZWxsOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGFyZ2g7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZWVrOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OndoaXp6Owold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OmtlcmJvb207CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6cG9wOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9sZE5hbWVTdHJ1Y3Q6OnNpbXBsZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6c2luZ2xlbmFtZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2xkTmFtZVN0cnVjdDo6ZG91YmxlbmFtZTE7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgVHJlZXNDbGFzczo6b2FrOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIFRyZWVzQ2xhc3M6OmZpcjsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBUcmVlc0NsYXNzOjpwaW5lOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmJsb25kZTsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpnaW5nZXI7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgT2JzY3VyZTo6b25lOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9ic2N1cmU6Om9uZXRyYWlsOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIE9ic2N1cmU6OnR3bzsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d29hZ2FpbjsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d290cmFpbDsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBPYnNjdXJlOjp0d290cmFpbGFnYWluOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIGdsb2JhbGluc3RhbmNlMTsKJXdhcm5maWx0ZXIoU1dJR1dBUk5fUlVCWV9XUk9OR19OQU1FKSBnbG9iYWxpbnN0YW5jZTI7CiV3YXJuZmlsdGVyKFNXSUdXQVJOX1JVQllfV1JPTkdfTkFNRSkgZ2xvYmFsaW5zdGFuY2UzOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UxOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UyOwold2FybmZpbHRlcihTV0lHV0FSTl9SVUJZX1dST05HX05BTUUpIEluc3RhbmNlczo6bWVtYmVyaW5zdGFuY2UzOwoKJXdhcm5maWx0ZXIoU1dJR1dBUk5fR09fTkFNRV9DT05GTElDVCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmluZyAnb25lJyBkdWUgdG8gR28gbmFtZSAoJ09ic2N1cmVPbmUnKSBjb25mbGljdCB3aXRoICdPYnNjdXJlOjpPbmUnICovCgolaW5saW5lICV7CgojaWYgX19HTlVDX18gPj0gNSB8fCAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA4KQovKiBmb3IgYW5vbnltb3VzIGVudW1zICovCi8qIGRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyBbLVdlcnJvcj1zdHJpY3QtYWxpYXNpbmddICovCiNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCiNlbmRpZgoKZW51bSB7IEFub25FbnVtMSwgQW5vbkVudW0yID0gMTAwIH07CmVudW0geyBSZWFsbHlBbkludGVnZXIgPSAyMDAgfTsKLy9lbnVtIHsgQW5vbkVudW0zLCBBbm9uRW51bTQgfSBpbnN0YW5jZTsKbmFtZXNwYWNlIEFub25TcGFjZSB7CiAgZW51bSB7IEFub25TcGFjZUVudW0xLCBBbm9uU3BhY2VFbnVtMiA9IDMwMCB9OwogIHN0cnVjdCBBbm9uU3RydWN0IHsKICAgIGVudW0geyBBbm9uU3RydWN0RW51bTEsIEFub25TdHJ1Y3RFbnVtMiA9IDQwMCB9OwogIH07Cn0KCgplbnVtIGNvbG91ciB7IHJlZD0tMSwgYmx1ZSwgZ3JlZW4gPSAxMCB9Owpjb2xvdXIgY29sb3VyVGVzdDEoY29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KZW51bSBjb2xvdXIgY29sb3VyVGVzdDIoZW51bSBjb2xvdXIgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBjb2xvdXIgY29sb3VyVGVzdDMoY29uc3QgY29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgZW51bSBjb2xvdXIgY29sb3VyVGVzdDQoY29uc3QgZW51bSBjb2xvdXIgZSkgeyByZXR1cm4gZTsgfQoKY29sb3VyIG15Q29sb3VyOwoKc3RydWN0IFNwZWVkQ2xhc3MgewogIGVudW0gc3BlZWQgeyBzbG93PTEwLCBtZWRpdW09MjAsIGZhc3Q9MzAsIGxpZ2h0bmluZyB9OwogIHR5cGVkZWYgZW51bSBzcGVlZCBzcGVlZHRkMTsKCiAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRUZXN0MChpbnQgcykgeyByZXR1cm4gczsgfQogIHNwZWVkICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkVGVzdDEoc3BlZWQgcykgeyByZXR1cm4gczsgfQogIGVudW0gc3BlZWQgICAgICAgICAgICAgICAgICAgIHNwZWVkVGVzdDIoZW51bSBzcGVlZCBzKSB7IHJldHVybiBzOyB9CiAgY29uc3Qgc3BlZWQgICAgICAgICAgICAgICAgICAgc3BlZWRUZXN0Myhjb25zdCBzcGVlZCBzKSB7IHJldHVybiBzOyB9CiAgY29uc3QgZW51bSBzcGVlZCAgICAgICAgICAgICAgc3BlZWRUZXN0NChjb25zdCBlbnVtIHNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KICBzcGVlZHRkMSAgICAgICAgICAgICAgICAgICAgICBzcGVlZFRlc3Q1KHNwZWVkdGQxIHMpIHsgcmV0dXJuIHM7IH0KICBjb25zdCBzcGVlZHRkMSAgICAgICAgICAgICAgICBzcGVlZFRlc3Q2KGNvbnN0IHNwZWVkdGQxIHMpIHsgcmV0dXJuIHM7IH0KICBjb25zdCBzcGVlZCAmICAgICAgICAgICAgICAgICBzcGVlZFRlc3Q3KGNvbnN0IHNwZWVkICZzKSB7IHJldHVybiBzOyB9CiAgY29uc3QgZW51bSBzcGVlZCAmICAgICAgICAgICAgc3BlZWRUZXN0OChjb25zdCBlbnVtIHNwZWVkICZzKSB7IHJldHVybiBzOyB9CgogIGNvbnN0IGNvbG91ciBteUNvbG91cjI7CiAgc3BlZWR0ZDEgbXlTcGVlZHRkMTsKICBTcGVlZENsYXNzKCkgOiBteUNvbG91cjIocmVkKSwgbXlTcGVlZHRkMShzbG93KSB7IH0KfTsKCmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZFRlc3QwKGludCBzKSB7IHJldHVybiBzOyB9ClNwZWVkQ2xhc3M6OnNwZWVkICAgICAgICAgICAgICBzcGVlZFRlc3QxKFNwZWVkQ2xhc3M6OnNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KZW51bSBTcGVlZENsYXNzOjpzcGVlZCAgICAgICAgIHNwZWVkVGVzdDIoZW51bSBTcGVlZENsYXNzOjpzcGVlZCBzKSB7IHJldHVybiBzOyB9CmNvbnN0IFNwZWVkQ2xhc3M6OnNwZWVkICAgICAgICBzcGVlZFRlc3QzKGNvbnN0IFNwZWVkQ2xhc3M6OnNwZWVkIHMpIHsgcmV0dXJuIHM7IH0KY29uc3QgZW51bSBTcGVlZENsYXNzOjpzcGVlZCAgIHNwZWVkVGVzdDQoY29uc3QgZW51bSBTcGVlZENsYXNzOjpzcGVlZCBzKSB7IHJldHVybiBzOyB9CmNvbnN0IFNwZWVkQ2xhc3M6OnNwZWVkICYgICAgICBzcGVlZFRlc3Q1KGNvbnN0IFNwZWVkQ2xhc3M6OnNwZWVkICZzKSB7IHJldHVybiBzOyB9CgoKdHlwZWRlZiBlbnVtIHsgTmFtZWRBbm9uMSwgTmFtZWRBbm9uMiB9IG5hbWVkYW5vbjsKCm5hbWVkYW5vbiAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRhbm9uVGVzdDEobmFtZWRhbm9uIGUpIHsgcmV0dXJuIGU7IH0gCgp0eXBlZGVmIGVudW0gdHdvbmFtZXN0YWcgeyBUd29OYW1lczEsIFR3b05hbWVzMiwgVHdvTmFtZXMzID0gMzMgfSB0d29uYW1lczsKCnR3b25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgdHdvbmFtZXNUZXN0MSh0d29uYW1lcyBlKSB7IHJldHVybiBlOyB9IAp0d29uYW1lc3RhZyAgICAgICAgICAgICAgICAgICAgIHR3b25hbWVzVGVzdDIodHdvbmFtZXN0YWcgZSkgeyByZXR1cm4gZTsgfSAKZW51bSB0d29uYW1lc3RhZyAgICAgICAgICAgICAgICB0d29uYW1lc1Rlc3QzKGVudW0gdHdvbmFtZXN0YWcgZSkgeyByZXR1cm4gZTsgfSAKCnN0cnVjdCBUd29OYW1lc1N0cnVjdCB7CiAgdHlwZWRlZiBlbnVtIHR3b25hbWVzdGFnIHsgVHdvTmFtZXNTdHJ1Y3QxLCBUd29OYW1lc1N0cnVjdDIgfSB0d29uYW1lczsKICB0d29uYW1lcyAgICAgICAgICAgICAgICAgICAgICB0d29uYW1lc1Rlc3QxKHR3b25hbWVzIGUpIHsgcmV0dXJuIGU7IH0gCiAgdHdvbmFtZXN0YWcgICAgICAgICAgICAgICAgICAgdHdvbmFtZXNUZXN0Mih0d29uYW1lc3RhZyBlKSB7IHJldHVybiBlOyB9IAogIGVudW0gdHdvbmFtZXN0YWcgICAgICAgICAgICAgIHR3b25hbWVzVGVzdDMoZW51bSB0d29uYW1lc3RhZyBlKSB7IHJldHVybiBlOyB9IAp9OwoKbmFtZXNwYWNlIEFub25TcGFjZXsKICB0eXBlZGVmIGVudW0geyBOYW1lZEFub25TcGFjZTEsIE5hbWVkQW5vblNwYWNlMiB9IG5hbWVkYW5vbnNwYWNlOwogIG5hbWVkYW5vbnNwYWNlICAgICAgICAgICAgICAgIG5hbWVkYW5vbnNwYWNlVGVzdDEobmFtZWRhbm9uc3BhY2UgZSkgeyByZXR1cm4gZTsgfSAKICBBbm9uU3BhY2U6Om5hbWVkYW5vbnNwYWNlICAgICBuYW1lZGFub25zcGFjZVRlc3QyKEFub25TcGFjZTo6bmFtZWRhbm9uc3BhY2UgZSkgeyByZXR1cm4gZTsgfSAKfQpBbm9uU3BhY2U6Om5hbWVkYW5vbnNwYWNlICAgICAgIG5hbWVkYW5vbnNwYWNlVGVzdDMoQW5vblNwYWNlOjpuYW1lZGFub25zcGFjZSBlKSB7IHJldHVybiBlOyB9IAp1c2luZyBuYW1lc3BhY2UgQW5vblNwYWNlOwpuYW1lZGFub25zcGFjZSAgICAgICAgICAgICAgICAgIG5hbWVkYW5vbnNwYWNlVGVzdDQobmFtZWRhbm9uc3BhY2UgZSkgeyByZXR1cm4gZTsgfSAKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVGVtcGxhdGVDbGFzcyB7CiAgZW51bSBzY2llbnRpc3RzIHsgZWluc3RlaW4sIGdhbGlsZW8gPSAxMCB9OyAKICB0eXBlZGVmIGVudW0gc2NpZW50aXN0cyBzY2llbnRpc3RzdGQxOwogIHR5cGVkZWYgc2NpZW50aXN0cyBzY2llbnRpc3RzdGQyOwogIHR5cGVkZWYgc2NpZW50aXN0c3RkMSBzY2llbnRpc3RzdGQzOwogIHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0MShzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBlbnVtIHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdDIoZW51bSBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdDMoY29uc3Qgc2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgZW51bSBzY2llbnRpc3RzICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c1Rlc3Q0KGNvbnN0IGVudW0gc2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgc2NpZW50aXN0c1Rlc3Q1KHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICAgIHNjaWVudGlzdHNUZXN0Nihjb25zdCB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBlbnVtIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzVGVzdDcoZW51bSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHMgICBzY2llbnRpc3RzVGVzdDgoY29uc3QgZW51bSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzICAgICAgICBzY2llbnRpc3RzVGVzdDkodHlwZW5hbWUgVGVtcGxhdGVDbGFzczo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ci8vICBlbnVtIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgICAgICAgICAgICBzY2llbnRpc3RzVGVzdEEoZW51bSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzICBzY2llbnRpc3RzVGVzdEIoY29uc3QgdHlwZW5hbWUgVGVtcGxhdGVDbGFzczo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ci8vICBjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgICAgICBzY2llbnRpc3RzVGVzdEMoY29uc3QgZW51bSBUZW1wbGF0ZUNsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBzY2llbnRpc3RzdGQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdEQoc2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9CiAgc2NpZW50aXN0c3RkMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c1Rlc3RFKHNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQogIHNjaWVudGlzdHN0ZDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNUZXN0RihzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzdGQxICBzY2llbnRpc3RzVGVzdEcodHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVGVtcGxhdGVDbGFzczxUPjo6c2NpZW50aXN0c3RkMiAgc2NpZW50aXN0c1Rlc3RIKHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRlbXBsYXRlQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDMgIHNjaWVudGlzdHNUZXN0SSh0eXBlbmFtZSBUZW1wbGF0ZUNsYXNzPFQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBzY2llbnRpc3RzICYgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdEooY29uc3Qgc2NpZW50aXN0cyAmZSkgeyByZXR1cm4gZTsgfQp9OwoKVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICBzY2llbnRpc3RzVGVzdDEoVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICBzY2llbnRpc3RzVGVzdDIoY29uc3QgVGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KZW51bSBUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzVGVzdDMoZW51bSBUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgIHNjaWVudGlzdHNUZXN0NChjb25zdCBlbnVtIFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9ClRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSAgICAgICAgICAgc2NpZW50aXN0c1Rlc3Q1KFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9ClRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgc2NpZW50aXN0c1Rlc3Q2KFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9ClRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAgICAgICAgICAgc2NpZW50aXN0c1Rlc3Q3KFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAmICAgc2NpZW50aXN0c1Rlc3Q4KGNvbnN0IFRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAmZSkgeyByZXR1cm4gZTsgfQoKCm5hbWVzcGFjZSBOYW1lIHsKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFRDbGFzcyB7CiAgZW51bSBzY2llbnRpc3RzIHsgZmFyYWRheSwgYmVsbCA9IDIwIH07IAogIHR5cGVkZWYgZW51bSBzY2llbnRpc3RzIHNjaWVudGlzdHN0ZDE7CiAgdHlwZWRlZiBzY2llbnRpc3RzIHNjaWVudGlzdHN0ZDI7CiAgdHlwZWRlZiBzY2llbnRpc3RzdGQxIHNjaWVudGlzdHN0ZDM7CiAgc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0MShzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBlbnVtIHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3QyKGVudW0gc2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3Qgc2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0Myhjb25zdCBzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIHNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q0KGNvbnN0IGVudW0gc2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0NSh0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDYoY29uc3QgdHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBlbnVtIFRDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q3KGVudW0gVENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIFRDbGFzczxUPjo6c2NpZW50aXN0cyAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q4KGNvbnN0IGVudW0gVENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUQ2xhc3M6OnNjaWVudGlzdHMgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q5KHR5cGVuYW1lIFRDbGFzczo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ci8vICBlbnVtIFRDbGFzczo6c2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RBKGVudW0gVENsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0eXBlbmFtZSBUQ2xhc3M6OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RCKGNvbnN0IHR5cGVuYW1lIFRDbGFzczo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ci8vICBjb25zdCBlbnVtIFRDbGFzczo6c2NpZW50aXN0cyAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RDKGNvbnN0IGVudW0gVENsYXNzOjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBzY2llbnRpc3RzdGQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3REKHNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIHNjaWVudGlzdHN0ZDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEUoc2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9CiAgc2NpZW50aXN0c3RkMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0RihzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KICB0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDEgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3RHKHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0c3RkMSBlKSB7IHJldHVybiBlOyB9CiAgdHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzdGQyICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0SCh0eXBlbmFtZSBUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIFRDbGFzczxUPjo6c2NpZW50aXN0c3RkMyAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdEkodHlwZW5hbWUgVENsYXNzPFQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KCiAgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3QxKHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHlwZW5hbWUgTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3QyKGNvbnN0IHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgZW51bSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHMgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3QzKGVudW0gTmFtZTo6VENsYXNzPFQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0cyAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDQoY29uc3QgZW51bSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMSAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0NSh0eXBlbmFtZSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMiAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0Nih0eXBlbmFtZSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQogIHR5cGVuYW1lIE5hbWU6OlRDbGFzczxUPjo6c2NpZW50aXN0c3RkMyAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0Nyh0eXBlbmFtZSBOYW1lOjpUQ2xhc3M8VD46OnNjaWVudGlzdHN0ZDMgZSkgeyByZXR1cm4gZTsgfQoKICAvLyBUZXN0IFRlbXBsYXRlQ2xhc3M6OnNjaWVudGlzdHMgcmF0aGVyIHRoZW4gVENsYXNzOjpzY2llbnRpc3RzCiAgOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgIHNjaWVudGlzdHNPdGhlclRlc3QxKDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgc2NpZW50aXN0c090aGVyVGVzdDIoY29uc3QgOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQogIGVudW0gOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzT3RoZXJUZXN0MyhlbnVtIDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBlbnVtIDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgc2NpZW50aXN0c090aGVyVGVzdDQoY29uc3QgZW51bSA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CiAgOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgICAgICAgICAgIHNjaWVudGlzdHNPdGhlclRlc3Q1KDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICA6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgc2NpZW50aXN0c090aGVyVGVzdDYoOjpUZW1wbGF0ZUNsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQogIDo6VGVtcGxhdGVDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgICBzY2llbnRpc3RzT3RoZXJUZXN0Nyg6OlRlbXBsYXRlQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyBlKSB7IHJldHVybiBlOyB9Cn07CgpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDEoVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDIoY29uc3QgVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQplbnVtIFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lVGVzdDMoZW51bSBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmNvbnN0IGVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgc2NpZW50aXN0c05hbWVUZXN0NChjb25zdCBlbnVtIFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q1KFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q2KFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQyIGUpIHsgcmV0dXJuIGU7IH0KVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDMgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVRlc3Q3KFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KCk5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3QxKE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDIoY29uc3QgTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQplbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0MyhlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgZW51bSBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDQoY29uc3QgZW51bSBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ck5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q1KE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDYoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQpOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0NyhOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyBlKSB7IHJldHVybiBlOyB9Cn0KCk5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3Q4KE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdDkoY29uc3QgTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQplbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0QShlbnVtIE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgZW51bSBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEIoY29uc3QgZW51bSBOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9Ck5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RDKE5hbWU6OlRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQxIGUpIHsgcmV0dXJuIGU7IH0KTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEQoTmFtZTo6VENsYXNzPGludD46OnNjaWVudGlzdHN0ZDIgZSkgeyByZXR1cm4gZTsgfQpOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0RShOYW1lOjpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMyBlKSB7IHJldHVybiBlOyB9Cgp1c2luZyBuYW1lc3BhY2UgTmFtZTsKVENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEYoVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0Ryhjb25zdCBUQ2xhc3M8aW50Pjo6c2NpZW50aXN0cyBlKSB7IHJldHVybiBlOyB9CmVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RIKGVudW0gVENsYXNzPGludD46OnNjaWVudGlzdHMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBlbnVtIFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0SShjb25zdCBlbnVtIFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzIGUpIHsgcmV0dXJuIGU7IH0KVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgICAgICAgICAgICAgICAgICBzY2llbnRpc3RzTmFtZVNwYWNlVGVzdEooVENsYXNzPGludD46OnNjaWVudGlzdHN0ZDEgZSkgeyByZXR1cm4gZTsgfQpUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiAgICAgICAgICAgICAgICAgIHNjaWVudGlzdHNOYW1lU3BhY2VUZXN0SyhUQ2xhc3M8aW50Pjo6c2NpZW50aXN0c3RkMiBlKSB7IHJldHVybiBlOyB9ClRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzICAgICAgICAgICAgICAgICAgc2NpZW50aXN0c05hbWVTcGFjZVRlc3RMKFRDbGFzczxpbnQ+OjpzY2llbnRpc3RzdGQzIGUpIHsgcmV0dXJuIGU7IH0KCiV9CgoldGVtcGxhdGUoVGVtcGxhdGVDbGFzc0ludCkgVGVtcGxhdGVDbGFzczxpbnQ+OwoldGVtcGxhdGUoVENsYXNzSW50KSBOYW1lOjpUQ2xhc3M8aW50PjsKCgovLyAlcmVuYW1lIHRlc3RzCiVyZW5hbWUoTmV3TmFtZVN0cnVjdCkgT2xkTmFtZVN0cnVjdDsKJXJlbmFtZShuZXduYW1lKSBvbGRfbmFtZTsKJXJlbmFtZShkb3VibGVuYW1lcmVuYW1lZCkgZG91YmxlbmFtZTsKJXJlbmFtZShzaW1wbGVyZW5hbWVkKSBzaW1wbGU7CiVyZW5hbWUoc2luZ2xlbmFtZXJlbmFtZWQpIHNpbmdsZW5hbWU7CiVyZW5hbWUoYmFuZykgT2xkTmFtZVN0cnVjdDo6a2VyYm9vbTsKCiVpbmxpbmUgJXsKZW51bSBvbGRfbmFtZSB7IGFyZ2gsIGVlayA9IC0xIH07CnR5cGVkZWYgb2xkX25hbWUgb2xkX25hbWV0ZDsKb2xkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lVGVzdDEob2xkX25hbWUgZSkgeyByZXR1cm4gZTsgfQpvbGRfbmFtZXRkICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVUZXN0MihvbGRfbmFtZXRkIGUpIHsgcmV0dXJuIGU7IH0KCnN0cnVjdCBPbGROYW1lU3RydWN0IHsKICBlbnVtIGVudW1lcmF0aW9uIHt3aGl6eiwga2VyYm9vbSwgcG9wfTsKICBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lVGVzdDEoZW51bWVyYXRpb24gZSkgeyByZXR1cm4gZTsgfQogIE9sZE5hbWVTdHJ1Y3Q6OmVudW1lcmF0aW9uICAgICAgICByZW5hbWVUZXN0MihPbGROYW1lU3RydWN0OjplbnVtZXJhdGlvbiBlKSB7IHJldHVybiBlOyB9CgogIGVudW0gc2ltcGxlIHtzaW1wbGUxfTsKICB0eXBlZGVmIGVudW0gZG91YmxlbmFtZXRhZyB7ZG91YmxlbmFtZTF9IGRvdWJsZW5hbWU7CiAgdHlwZWRlZiBlbnVtIHtzaW5nbGVuYW1lMX0gc2luZ2xlbmFtZTsKCiAgc2ltcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVRlc3QzKHNpbXBsZSBlKSB7IHJldHVybiBlOyB9CiAgZG91YmxlbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVRlc3Q0KGRvdWJsZW5hbWUgZSkgeyByZXR1cm4gZTsgfQogIGRvdWJsZW5hbWV0YWcgICAgICAgICAgICAgICAgICAgICByZW5hbWVUZXN0NShkb3VibGVuYW1ldGFnIGUpIHsgcmV0dXJuIGU7IH0KICBzaW5nbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lVGVzdDYoc2luZ2xlbmFtZSBlKSB7IHJldHVybiBlOyB9Cn07CgpPbGROYW1lU3RydWN0OjplbnVtZXJhdGlvbiAgICAgICAgICByZW5hbWVUZXN0MyhPbGROYW1lU3RydWN0OjplbnVtZXJhdGlvbiBlKSB7IHJldHVybiBlOyB9Ck9sZE5hbWVTdHJ1Y3Q6OnNpbXBsZSAgICAgICAgICAgICAgIHJlbmFtZVRlc3Q0KE9sZE5hbWVTdHJ1Y3Q6OnNpbXBsZSBlKSB7IHJldHVybiBlOyB9Ck9sZE5hbWVTdHJ1Y3Q6OmRvdWJsZW5hbWUgICAgICAgICAgIHJlbmFtZVRlc3Q1KE9sZE5hbWVTdHJ1Y3Q6OmRvdWJsZW5hbWUgZSkgeyByZXR1cm4gZTsgfQpPbGROYW1lU3RydWN0Ojpkb3VibGVuYW1ldGFnICAgICAgICByZW5hbWVUZXN0NihPbGROYW1lU3RydWN0Ojpkb3VibGVuYW1ldGFnIGUpIHsgcmV0dXJuIGU7IH0KT2xkTmFtZVN0cnVjdDo6c2luZ2xlbmFtZSAgICAgICAgICAgcmVuYW1lVGVzdDcoT2xkTmFtZVN0cnVjdDo6c2luZ2xlbmFtZSBlKSB7IHJldHVybiBlOyB9CiV9CgolcmVuYW1lKENsYXNoMV9kaTEpIENsYXNoMTo6ZGkxOwolcmVuYW1lKENsYXNoMV9kaTIpIENsYXNoMTo6ZGkyOwolcmVuYW1lKENsYXNoMV9kaTMpIENsYXNoMTo6ZGkzOwolaW5saW5lICV7Cm5hbWVzcGFjZSBDbGFzaDEgewogIGVudW0gRHVwbGljYXRlSXRlbXMxIHsgZGkxLCBkaTIgPSAxMCwgZGkzIH07Cn0KbmFtZXNwYWNlIENsYXNoMiB7CiAgZW51bSBEdXBsaWNhdGVJdGVtczIgeyBkaTEsIGRpMiA9IDEwLCBkaTMgfTsKfQolfQoKJWlubGluZSAlewpzdHJ1Y3QgVHJlZXNDbGFzcyB7CiAgZW51bSB0cmVlcyB7b2FrLCBmaXIsIHBpbmUgfTsKICB0eXBlZGVmIGVudW0gdHJlZXMgdHJlZXN0ZDE7CiAgdHlwZWRlZiB0cmVlcyB0cmVlc3RkMjsKICB0eXBlZGVmIHRyZWVzdGQxIHRyZWVzdGQzOwogIHR5cGVkZWYgVHJlZXNDbGFzczo6dHJlZXMgdHJlZXN0ZDQ7CiAgdHlwZWRlZiB0cmVlc3RkMSB0cmVlc3RkNTsKCiAgdHJlZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDEodHJlZXMgZSkgeyByZXR1cm4gZTsgfQogIHRyZWVzdGQxICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3QyKHRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICB0cmVlc3RkMiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Myh0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9CiAgdHJlZXN0ZDMgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDQodHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIHRyZWVzdGQ0ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q1KHRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KICB0cmVlc3RkNSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Nih0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHJlZXMgICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdDcoY29uc3QgdHJlZXMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHRyZWVzdGQxICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q4KGNvbnN0IHRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0cmVlc3RkMiAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0OShjb25zdCB0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgdHJlZXN0ZDMgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEEoY29uc3QgdHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IHRyZWVzdGQ0ICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RCKGNvbnN0IHRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCB0cmVlc3RkNSAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Qyhjb25zdCB0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9CiAgVHJlZXNDbGFzczo6dHJlZXMgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEQoVHJlZXNDbGFzczo6dHJlZXMgZSkgeyByZXR1cm4gZTsgfQogIFRyZWVzQ2xhc3M6OnRyZWVzdGQxICAgICAgICAgICAgICB0cmVlc1Rlc3RFKFRyZWVzQ2xhc3M6OnRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICBUcmVlc0NsYXNzOjp0cmVlc3RkMiAgICAgICAgICAgICAgdHJlZXNUZXN0RihUcmVlc0NsYXNzOjp0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9CiAgVHJlZXNDbGFzczo6dHJlZXN0ZDMgICAgICAgICAgICAgIHRyZWVzVGVzdEcoVHJlZXNDbGFzczo6dHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIFRyZWVzQ2xhc3M6OnRyZWVzdGQ0ICAgICAgICAgICAgICB0cmVlc1Rlc3RIKFRyZWVzQ2xhc3M6OnRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KICBUcmVlc0NsYXNzOjp0cmVlc3RkNSAgICAgICAgICAgICAgdHJlZXNUZXN0SShUcmVlc0NsYXNzOjp0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgVHJlZXNDbGFzczo6dHJlZXMgICAgICAgICAgIHRyZWVzVGVzdEooY29uc3QgVHJlZXNDbGFzczo6dHJlZXMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQxICAgICAgICB0cmVlc1Rlc3RLKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQxIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMiAgICAgICAgdHJlZXNUZXN0TChjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMiBlKSB7IHJldHVybiBlOyB9CiAgY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDMgICAgICAgIHRyZWVzVGVzdE0oY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDMgZSkgeyByZXR1cm4gZTsgfQogIGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ0ICAgICAgICB0cmVlc1Rlc3ROKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ0IGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkNSAgICAgICAgdHJlZXNUZXN0Tyhjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkNSBlKSB7IHJldHVybiBlOyB9Cn07CgpUcmVlc0NsYXNzOjp0cmVlcyAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3QxKFRyZWVzQ2xhc3M6OnRyZWVzIGUpIHsgcmV0dXJuIGU7IH0KVHJlZXNDbGFzczo6dHJlZXN0ZDEgICAgICAgICAgICAgICAgdHJlZXNUZXN0MihUcmVlc0NsYXNzOjp0cmVlc3RkMSBlKSB7IHJldHVybiBlOyB9ClRyZWVzQ2xhc3M6OnRyZWVzdGQyICAgICAgICAgICAgICAgIHRyZWVzVGVzdDMoVHJlZXNDbGFzczo6dHJlZXN0ZDIgZSkgeyByZXR1cm4gZTsgfQpUcmVlc0NsYXNzOjp0cmVlc3RkMyAgICAgICAgICAgICAgICB0cmVlc1Rlc3Q0KFRyZWVzQ2xhc3M6OnRyZWVzdGQzIGUpIHsgcmV0dXJuIGU7IH0KVHJlZXNDbGFzczo6dHJlZXN0ZDQgICAgICAgICAgICAgICAgdHJlZXNUZXN0NShUcmVlc0NsYXNzOjp0cmVlc3RkNCBlKSB7IHJldHVybiBlOyB9ClRyZWVzQ2xhc3M6OnRyZWVzdGQ1ICAgICAgICAgICAgICAgIHRyZWVzVGVzdDYoVHJlZXNDbGFzczo6dHJlZXN0ZDUgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUcmVlc0NsYXNzOjp0cmVlcyAgICAgICAgICAgICB0cmVlc1Rlc3Q3KGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDEgICAgICAgICAgdHJlZXNUZXN0OChjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMSBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQyICAgICAgICAgIHRyZWVzVGVzdDkoY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDIgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkMyAgICAgICAgICB0cmVlc1Rlc3RBKGNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQzIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDQgICAgICAgICAgdHJlZXNUZXN0Qihjb25zdCBUcmVlc0NsYXNzOjp0cmVlc3RkNCBlKSB7IHJldHVybiBlOyB9CmNvbnN0IFRyZWVzQ2xhc3M6OnRyZWVzdGQ1ICAgICAgICAgIHRyZWVzVGVzdEMoY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDUgZSkgeyByZXR1cm4gZTsgfQoKdHlwZWRlZiBlbnVtIFRyZWVzQ2xhc3M6OnRyZWVzIHRyZWVzZ2xvYmFsdGQxOwp0eXBlZGVmIFRyZWVzQ2xhc3M6OnRyZWVzIHRyZWVzZ2xvYmFsdGQyOwp0eXBlZGVmIFRyZWVzQ2xhc3M6OnRyZWVzdGQxIHRyZWVzZ2xvYmFsdGQzOwp0eXBlZGVmIFRyZWVzQ2xhc3M6OnRyZWVzdGQyIHRyZWVzZ2xvYmFsdGQ0Owp0eXBlZGVmIHRyZWVzZ2xvYmFsdGQ0IHRyZWVzZ2xvYmFsdGQ1OwoKdHJlZXNnbG9iYWx0ZDEgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0RCh0cmVlc2dsb2JhbHRkMSBlKSB7IHJldHVybiBlOyB9CnRyZWVzZ2xvYmFsdGQyICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEUodHJlZXNnbG9iYWx0ZDIgZSkgeyByZXR1cm4gZTsgfQp0cmVlc2dsb2JhbHRkMyAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RGKHRyZWVzZ2xvYmFsdGQzIGUpIHsgcmV0dXJuIGU7IH0KdHJlZXNnbG9iYWx0ZDQgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0Ryh0cmVlc2dsb2JhbHRkNCBlKSB7IHJldHVybiBlOyB9CnRyZWVzZ2xvYmFsdGQ1ICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdEgodHJlZXNnbG9iYWx0ZDUgZSkgeyByZXR1cm4gZTsgfQpjb25zdCB0cmVlc2dsb2JhbHRkMSAgICAgICAgICAgICAgICB0cmVlc1Rlc3RJKGNvbnN0IHRyZWVzZ2xvYmFsdGQxIGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgdHJlZXNnbG9iYWx0ZDIgICAgICAgICAgICAgICAgdHJlZXNUZXN0Sihjb25zdCB0cmVlc2dsb2JhbHRkMiBlKSB7IHJldHVybiBlOyB9CmNvbnN0IHRyZWVzZ2xvYmFsdGQzICAgICAgICAgICAgICAgIHRyZWVzVGVzdEsoY29uc3QgdHJlZXNnbG9iYWx0ZDMgZSkgeyByZXR1cm4gZTsgfQpjb25zdCB0cmVlc2dsb2JhbHRkNCAgICAgICAgICAgICAgICB0cmVlc1Rlc3RMKGNvbnN0IHRyZWVzZ2xvYmFsdGQ0IGUpIHsgcmV0dXJuIGU7IH0KY29uc3QgdHJlZXNnbG9iYWx0ZDUgICAgICAgICAgICAgICAgdHJlZXNUZXN0TShjb25zdCB0cmVlc2dsb2JhbHRkNSBlKSB7IHJldHVybiBlOyB9Cgp0eXBlZGVmIGNvbnN0IGVudW0gVHJlZXNDbGFzczo6dHJlZXMgdHJlZXNnbG9iYWx0ZDY7CnR5cGVkZWYgY29uc3QgVHJlZXNDbGFzczo6dHJlZXMgdHJlZXNnbG9iYWx0ZDc7CnR5cGVkZWYgY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDEgdHJlZXNnbG9iYWx0ZDg7CnR5cGVkZWYgY29uc3QgVHJlZXNDbGFzczo6dHJlZXN0ZDIgdHJlZXNnbG9iYWx0ZDk7CnR5cGVkZWYgY29uc3QgdHJlZXNnbG9iYWx0ZDQgdHJlZXNnbG9iYWx0ZEE7CgovL3RyZWVzZ2xvYmFsdGQ2ICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdE4odHJlZXNnbG9iYWx0ZDYgZSkgeyByZXR1cm4gZTsgfSAvLyBjYXN0aW5nIHVzaW5nIGFuIGludCBpbnN0ZWFkIG9mIHRyZWVzZ2xvYmFsdGQ2CnRyZWVzZ2xvYmFsdGQ3ICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdE8odHJlZXNnbG9iYWx0ZDcgZSkgeyByZXR1cm4gZTsgfQp0cmVlc2dsb2JhbHRkOCAgICAgICAgICAgICAgICAgICAgICB0cmVlc1Rlc3RQKHRyZWVzZ2xvYmFsdGQ4IGUpIHsgcmV0dXJuIGU7IH0KdHJlZXNnbG9iYWx0ZDkgICAgICAgICAgICAgICAgICAgICAgdHJlZXNUZXN0USh0cmVlc2dsb2JhbHRkOSBlKSB7IHJldHVybiBlOyB9CnRyZWVzZ2xvYmFsdGRBICAgICAgICAgICAgICAgICAgICAgIHRyZWVzVGVzdFIodHJlZXNnbG9iYWx0ZEEgZSkgeyByZXR1cm4gZTsgfQoKbmFtZXNwYWNlIGN1cmx5IHsKICBuYW1lc3BhY2UgZ3JlYXN5IHsKICAgIHN0cnVjdCBIYWlyU3RydWN0IHsKICAgICAgZW51bSBoYWlyIHsgYmxvbmRlPTB4RkYwLCBnaW5nZXIgfTsKICAgICAgdHlwZWRlZiBoYWlyIGhhaXJ0ZDE7CiAgICAgIHR5cGVkZWYgSGFpclN0cnVjdDo6aGFpciBoYWlydGQyOwogICAgICB0eXBlZGVmIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciBoYWlydGQzOwogICAgICB0eXBlZGVmIGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXIgaGFpcnRkNDsKICAgICAgdHlwZWRlZiA6OmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXIgaGFpcnRkNTsKICAgICAgdHlwZWRlZiBoYWlydGQxIGhhaXJ0ZDY7CiAgICAgIHR5cGVkZWYgSGFpclN0cnVjdDo6aGFpcnRkMSBoYWlydGQ3OwogICAgICB0eXBlZGVmIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMSBoYWlydGQ4OwogICAgICB0eXBlZGVmIGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgaGFpcnRkOTsKICAgICAgdHlwZWRlZiA6OmN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgaGFpcnRkQTsKICAgICAgaGFpciAgICAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3QxKGhhaXIgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQxICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDIoaGFpcnRkMSBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDIgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0MyhoYWlydGQyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkMyAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3Q0KGhhaXJ0ZDMgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ0ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDUoaGFpcnRkNCBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDUgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0NihoYWlydGQ1IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkNiAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3Q3KGhhaXJ0ZDYgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ3ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdDgoaGFpcnRkNyBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDggICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0OShoYWlydGQ4IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkOSAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RBKGhhaXJ0ZDkgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGRBICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEIoaGFpcnRkQSBlKSB7IHJldHVybiBlOyB9CgogICAgICA6OmNvbG91ciAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJUZXN0MSg6OmNvbG91ciBlKSB7IHJldHVybiBlOyB9CiAgICAgIGVudW0gY29sb3VyICAgICAgICAgICAgICAgICAgIGNvbG91clRlc3QyKGVudW0gY29sb3VyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgbmFtZWRhbm9uICAgICAgICAgICAgICAgICAgICAgbmFtZWRhbm9uVGVzdDEobmFtZWRhbm9uIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgQW5vblNwYWNlOjpuYW1lZGFub25zcGFjZSAgICAgIG5hbWVkYW5vbnNwYWNlVGVzdDEoQW5vblNwYWNlOjpuYW1lZGFub25zcGFjZSBlKSB7IHJldHVybiBlOyB9CgogICAgICB0cmVlc2dsb2JhbHRkMSAgICAgICAgICAgICAgICB0cmVlc0dsb2JhbFRlc3QxKHRyZWVzZ2xvYmFsdGQxIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgdHJlZXNnbG9iYWx0ZDIgICAgICAgICAgICAgICAgdHJlZXNHbG9iYWxUZXN0Mih0cmVlc2dsb2JhbHRkMiBlKSB7IHJldHVybiBlOyB9CiAgICAgIHRyZWVzZ2xvYmFsdGQzICAgICAgICAgICAgICAgIHRyZWVzR2xvYmFsVGVzdDModHJlZXNnbG9iYWx0ZDMgZSkgeyByZXR1cm4gZTsgfQogICAgICB0cmVlc2dsb2JhbHRkNCAgICAgICAgICAgICAgICB0cmVlc0dsb2JhbFRlc3Q0KHRyZWVzZ2xvYmFsdGQ0IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgdHJlZXNnbG9iYWx0ZDUgICAgICAgICAgICAgICAgdHJlZXNHbG9iYWxUZXN0NSh0cmVlc2dsb2JhbHRkNSBlKSB7IHJldHVybiBlOyB9CgogICAgfTsKICAgIEhhaXJTdHJ1Y3Q6OmhhaXIgICAgICAgICAgICAgICAgaGFpclRlc3QxKEhhaXJTdHJ1Y3Q6OmhhaXIgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkMSAgICAgICAgICAgICBoYWlyVGVzdDIoSGFpclN0cnVjdDo6aGFpcnRkMSBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQyICAgICAgICAgICAgIGhhaXJUZXN0MyhIYWlyU3RydWN0OjpoYWlydGQyIGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgICAgICAgICAgICAgaGFpclRlc3Q0KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkNCAgICAgICAgICAgICBoYWlyVGVzdDUoSGFpclN0cnVjdDo6aGFpcnRkNCBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQ1ICAgICAgICAgICAgIGhhaXJUZXN0NihIYWlyU3RydWN0OjpoYWlydGQ1IGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgICAgICAgICAgICAgaGFpclRlc3Q3KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkNyAgICAgICAgICAgICBoYWlyVGVzdDgoSGFpclN0cnVjdDo6aGFpcnRkNyBlKSB7IHJldHVybiBlOyB9CiAgICBIYWlyU3RydWN0OjpoYWlydGQ4ICAgICAgICAgICAgIGhhaXJUZXN0OShIYWlyU3RydWN0OjpoYWlydGQ4IGUpIHsgcmV0dXJuIGU7IH0KICAgIEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgICAgICAgICAgICAgaGFpclRlc3RBKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgZSkgeyByZXR1cm4gZTsgfQogICAgSGFpclN0cnVjdDo6aGFpcnRkQSAgICAgICAgICAgICBoYWlyVGVzdEIoSGFpclN0cnVjdDo6aGFpcnRkQSBlKSB7IHJldHVybiBlOyB9CiAgICBjb25zdCBIYWlyU3RydWN0OjpoYWlyICYgICAgICAgIGhhaXJUZXN0Qyhjb25zdCBIYWlyU3RydWN0OjpoYWlyICZlKSB7IHJldHVybiBlOyB9CiAgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciAgICAgICAgICBoYWlyVGVzdEExKGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpciBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQxICAgICAgIGhhaXJUZXN0QTIoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQxIGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgICAgICAgaGFpclRlc3RBMyhncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMyAgICAgICBoYWlyVGVzdEE0KGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkMyBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ0ICAgICAgIGhhaXJUZXN0QTUoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ0IGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgICAgICAgaGFpclRlc3RBNihncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNiAgICAgICBoYWlyVGVzdEE3KGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkNiBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ3ICAgICAgIGhhaXJUZXN0QTgoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ3IGUpIHsgcmV0dXJuIGU7IH0KICBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggICAgICAgaGFpclRlc3RBOShncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggZSkgeyByZXR1cm4gZTsgfQogIGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOSAgICAgICBoYWlyVGVzdEFBKGdyZWFzeTo6SGFpclN0cnVjdDo6aGFpcnRkOSBlKSB7IHJldHVybiBlOyB9CiAgZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGRBICAgICAgIGhhaXJUZXN0QUIoZ3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGRBIGUpIHsgcmV0dXJuIGU7IH0KICBjb25zdCBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJiAgICAgaGFpclRlc3RBQyhjb25zdCBncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJmUpIHsgcmV0dXJuIGU7IH0KfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlyICAgICBoYWlyVGVzdEIxKGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXIgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQxICBoYWlyVGVzdEIyKGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQyICBoYWlyVGVzdEIzKGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQzICBoYWlyVGVzdEI0KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ0ICBoYWlyVGVzdEI1KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ1ICBoYWlyVGVzdEI2KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ2ICBoYWlyVGVzdEI3KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ3ICBoYWlyVGVzdEI4KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ4ICBoYWlyVGVzdEI5KGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGQ5ICBoYWlyVGVzdEJBKGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgZSkgeyByZXR1cm4gZTsgfQpjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGRBICBoYWlyVGVzdEJCKGN1cmx5OjpncmVhc3k6OkhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGRBICYgaGFpclRlc3RCQyhjb25zdCBjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OjpoYWlydGRBICZlKSB7IHJldHVybiBlOyB9Cgp1c2luZyBjdXJseTo6Z3JlYXN5OjpIYWlyU3RydWN0OwpIYWlyU3RydWN0OjpoYWlyICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEMxKEhhaXJTdHJ1Y3Q6OmhhaXIgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQxICAgICAgICAgICAgICAgICBoYWlyVGVzdEMyKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDEgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQyICAgICAgICAgICAgICAgICBoYWlyVGVzdEMzKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDIgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQzICAgICAgICAgICAgICAgICBoYWlyVGVzdEM0KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDMgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ0ICAgICAgICAgICAgICAgICBoYWlyVGVzdEM1KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDQgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ1ICAgICAgICAgICAgICAgICBoYWlyVGVzdEM2KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDUgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ2ICAgICAgICAgICAgICAgICBoYWlyVGVzdEM3KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDYgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ3ICAgICAgICAgICAgICAgICBoYWlyVGVzdEM4KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDcgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ4ICAgICAgICAgICAgICAgICBoYWlyVGVzdEM5KEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDggZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGQ5ICAgICAgICAgICAgICAgICBoYWlyVGVzdENBKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZDkgZSkgeyByZXR1cm4gZTsgfQpIYWlyU3RydWN0OjpoYWlydGRBICAgICAgICAgICAgICAgICBoYWlyVGVzdENCKEhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgZSkgeyByZXR1cm4gZTsgfQpjb25zdCBIYWlyU3RydWN0OjpoYWlydGRBICYgICAgICAgICBoYWlyVGVzdENDKGNvbnN0IEhhaXJTdHJ1Y3Q6OmhhaXJ0ZEEgJmUpIHsgcmV0dXJuIGU7IH0KCm5hbWVzcGFjZSBjdXJseSB7CiAgbmFtZXNwYWNlIGdyZWFzeSB7CiAgICBzdHJ1Y3QgRmlyU3RydWN0IDogSGFpclN0cnVjdCB7CiAgICAgIGhhaXIgICAgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyMShoYWlyIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkMSAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXIyKGhhaXJ0ZDEgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQyICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjMoaGFpcnRkMiBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDMgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyNChoYWlydGQzIGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkNCAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXI1KGhhaXJ0ZDQgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ1ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjYoaGFpcnRkNSBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDYgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyNyhoYWlydGQ2IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkNyAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXI4KGhhaXJ0ZDcgZSkgeyByZXR1cm4gZTsgfQogICAgICBoYWlydGQ4ICAgICAgICAgICAgICAgICAgICAgICBoYWlyVGVzdEZpcjkoaGFpcnRkOCBlKSB7IHJldHVybiBlOyB9CiAgICAgIGhhaXJ0ZDkgICAgICAgICAgICAgICAgICAgICAgIGhhaXJUZXN0RmlyQShoYWlydGQ5IGUpIHsgcmV0dXJuIGU7IH0KICAgICAgaGFpcnRkQSAgICAgICAgICAgICAgICAgICAgICAgaGFpclRlc3RGaXJCKGhhaXJ0ZEEgZSkgeyByZXR1cm4gZTsgfQogICAgfTsKICB9Cn0KCnN0cnVjdCBPYnNjdXJlIHsKICBlbnVtIFplcm8ge307CiAgZW51bSBPbmUge29uZX07CiAgZW51bSBUd28ge3R3bywgdHdvYWdhaW59OwojaWYgZGVmaW5lZChTV0lHKQogIC8vIGcrKy00LjMgd2FybnMgYWJvdXQgdGhpcwogIHR5cGVkZWYgZW51bSBFbXB0eSB7fTsKI2VuZGlmCiAgdHlwZWRlZiBlbnVtIHt9IEFsc29FbXB0eTsKfTsKCi8vIFVubmFtZWQgZW51bSBpbnN0YW5jZQpleHRlcm4gIkMiIHsKZW51bSB7IGdsb2JhbGluc3RhbmNlMSwgZ2xvYmFsaW5zdGFuY2UyLCBnbG9iYWxpbnN0YW5jZTMgPSAzMCB9IEdsb2JhbEluc3RhbmNlOwp9CgpzdHJ1Y3QgSW5zdGFuY2VzIHsKICBlbnVtIHsgbWVtYmVyaW5zdGFuY2UxLCBtZW1iZXJpbnN0YW5jZTIsIG1lbWJlcmluc3RhbmNlMyA9IDMwMCB9IE1lbWJlckluc3RhbmNlOwogIEluc3RhbmNlcygpIDogTWVtYmVySW5zdGFuY2UobWVtYmVyaW5zdGFuY2UzKSB7fQp9OwoKJX0KCi8vIFJlcGVhdGVkIHZhbHVlcwojaWYgZGVmaW5lZChTV0lHSkFWQSkKJWphdmFjb25zdCgxKTsKLy8gbmVlZGVkIGZvciB0eXBlc2FmZSBhbmQgcHJvcGVyIGVudW1zIG9ubHkKJWphdmFjb25zdCgwKSBpZ25vcmVBX3RocmVlOwolamF2YWNvbnN0KDApIGlnbm9yZUFfdGhpcnRlZW47CiNlbGlmIGRlZmluZWQoU1dJR0NTSEFSUCkKLy8gbmVlZGVkIGZvciB0eXBlc2FmZSBlbnVtcyBvbmx5CiNpZmRlZiBTV0lHX1RFU1RfTk9DU0NPTlNUCiAgJWNzY29uc3QoMCkgaWdub3JlQV90aHJlZTsKICAlY3Njb25zdCgwKSBpZ25vcmVBX3RoaXJ0ZWVuOwojZW5kaWYKJWNzY29uc3QoMSk7CiNlbmRpZgoKJWlnbm9yZSBpZ25vcmVBX29uZTsKJWlnbm9yZSBpZ25vcmVBX3R3bzsKJWlnbm9yZSBpZ25vcmVBX3R3ZWx2ZTsKJWlnbm9yZSBpZ25vcmVBX3RoaXJ0eV9vbmU7CgolaWdub3JlIGlnbm9yZUJfdGVuOwolaWdub3JlIGlnbm9yZUJfdHdlbnR5OwolaWdub3JlIGlnbm9yZUJfdGhpcnR5OwolaWdub3JlIGlnbm9yZUJfZm9ydHk7CgolaWdub3JlIGlnbm9yZUNfZWxldmVuOwolaWdub3JlIGlnbm9yZUNfdGhpcnR5X29uZTsKJWlnbm9yZSBpZ25vcmVDX2ZvcnR5X29uZTsKCiVpZ25vcmUgaWdub3JlRF90ZW47CiVpZ25vcmUgaWdub3JlRF90d2VudHk7CgolaWdub3JlIGlnbm9yZUVfdHdlbnR5OwoKJWlubGluZSAlewpzdHJ1Y3QgSWdub3JlVGVzdCB7CiAgZW51bSBJZ25vcmVBIHsgaWdub3JlQV96ZXJvLCBpZ25vcmVBX29uZSwgaWdub3JlQV90d28sIGlnbm9yZUFfdGhyZWUsIGlnbm9yZUFfdGVuPTEwLCBpZ25vcmVBX2VsZXZlbiwgaWdub3JlQV90d2VsdmUsIGlnbm9yZUFfdGhpcnRlZW4sIGlnbm9yZUFfZm91cnRlZW4sIGlnbm9yZUFfdHdlbnR5PTIwLCBpZ25vcmVBX3RoaXJ0eT0zMCwgaWdub3JlQV90aGlydHlfb25lLCBpZ25vcmVBX3RoaXJ0eV90d28sIGlnbm9yZUFfdGhpcnR5X3RocmVlIH07CiAgZW51bSBJZ25vcmVCIHsgaWdub3JlQl90ZW49MTAsIGlnbm9yZUJfZWxldmVuLCBpZ25vcmVCX3R3ZWx2ZSwgaWdub3JlQl90d2VudHk9MjAsIGlnbm9yZUJfdGhpcnR5PTMwLCBpZ25vcmVCX3RoaXJ0eV9vbmUsIGlnbm9yZUJfdGhpcnR5X3R3bywgaWdub3JlQl9mb3J0eT00MCwgaWdub3JlQl9mb3J0eV9vbmUsIGlnbm9yZUJfZm9ydHlfdHdvIH07CiAgZW51bSBJZ25vcmVDIHsgaWdub3JlQ190ZW49MTAsIGlnbm9yZUNfZWxldmVuLCBpZ25vcmVDX3R3ZWx2ZSwgaWdub3JlQ190d2VudHk9MjAsIGlnbm9yZUNfdGhpcnR5PTMwLCBpZ25vcmVDX3RoaXJ0eV9vbmUsIGlnbm9yZUNfdGhpcnR5X3R3bywgaWdub3JlQ19mb3J0eT00MCwgaWdub3JlQ19mb3J0eV9vbmUsIGlnbm9yZUNfZm9ydHlfdHdvIH07CiAgZW51bSBJZ25vcmVEIHsgaWdub3JlRF90ZW49MTAsIGlnbm9yZURfdHdlbnR5PTIwLCBpZ25vcmVEX3R3ZW50eV9vbmUsIGlnbm9yZURfdHdlbnR5X3R3byB9OwogIGVudW0gSWdub3JlRSB7IGlnbm9yZUVfemVybywgaWdub3JlRV90d2VudHk9MjAsIGlnbm9yZUVfdHdlbnR5X29uZSwgaWdub3JlRV90d2VudHlfdHdvIH07Cn07CgpJZ25vcmVUZXN0OjpJZ25vcmVBIGlnbm9yZUFUZXN0KElnbm9yZVRlc3Q6Oklnbm9yZUEgbikgeyByZXR1cm4gbjsgfQpJZ25vcmVUZXN0OjpJZ25vcmVCIGlnbm9yZUJUZXN0KElnbm9yZVRlc3Q6Oklnbm9yZUIgbikgeyByZXR1cm4gbjsgfQpJZ25vcmVUZXN0OjpJZ25vcmVDIGlnbm9yZUNUZXN0KElnbm9yZVRlc3Q6Oklnbm9yZUMgbikgeyByZXR1cm4gbjsgfQpJZ25vcmVUZXN0OjpJZ25vcmVEIGlnbm9yZURUZXN0KElnbm9yZVRlc3Q6Oklnbm9yZUQgbikgeyByZXR1cm4gbjsgfQpJZ25vcmVUZXN0OjpJZ25vcmVFIGlnbm9yZUVUZXN0KElnbm9yZVRlc3Q6Oklnbm9yZUUgbikgeyByZXR1cm4gbjsgfQolfQoKJWlubGluZSAlewpuYW1lc3BhY2UgUmVwZWF0U3BhY2Ugewp0eXBlZGVmIGVudW0KewogICBvbmUgPSAxLAogICBpbml0aWFsID0gb25lLAogICB0d28sCiAgIHRocmVlLAogICBsbGFzdCA9IHRocmVlLAogICBlbmQgPSBsbGFzdAp9IHJlcGVhdDsKcmVwZWF0IHJlcGVhdFRlc3QocmVwZWF0IGUpIHsgcmV0dXJuIGU7IH0KfQolfQoKJWlubGluZSAlewpuYW1lc3BhY2UgRW51bVdpdGhNYWNybyB7CiNkZWZpbmUgUEFDSyhDMSxDMixDMyxDNCkgKChDMTw8MjQpfChDMjw8MTYpfChDMzw8OCl8QzQpCnR5cGVkZWYgZW51bSB7CiAgQUJDRCA9IFBBQ0soJ0EnLCdCJywnQycsJ0QnKSwKICBBQkNEMiA9IEFCQ0QKfSBlbnVtV2l0aE1hY3JvOwplbnVtV2l0aE1hY3JvIGVudW1XaXRoTWFjcm9UZXN0KGVudW1XaXRoTWFjcm8gZSkgeyByZXR1cm4gZTsgfQp9CiV9CgolaW5saW5lICV7Cm5hbWVzcGFjZSBEaWZmZXJlbnRTcGFjZSB7CmVudW0gRGlmZmVyZW50VHlwZXMgewogIHR5cGVpbnQgPSAxMCwKICB0eXBlYm9vbGZhbHNlID0gZmFsc2UsCiAgdHlwZWJvb2x0cnVlID0gdHJ1ZSwKICB0eXBlYm9vbHR3bywKICB0eXBlY2hhciA9ICdDJywKICB0eXBlZGVmYXVsdGludCwKICB0eXBlY2hhcmNvbXBvdW5kPSdBJysxLAogIHR5cGVjaGFyY29tcG91bmQyPSdCJyA8PCAyCn07CkRpZmZlcmVudFR5cGVzIGRpZmZlcmVudFR5cGVzVGVzdChEaWZmZXJlbnRUeXBlcyBuKSB7IHJldHVybiBuOyB9CgplbnVtIHsKICBnbG9iYWxfdHlwZWludCA9IDEwLAogIGdsb2JhbF90eXBlYm9vbGZhbHNlID0gZmFsc2UsCiAgZ2xvYmFsX3R5cGVib29sdHJ1ZSA9IHRydWUsCiAgZ2xvYmFsX3R5cGVib29sdHdvLAogIGdsb2JhbF90eXBlY2hhciA9ICdDJywKICBnbG9iYWxfdHlwZWRlZmF1bHRpbnQsCiAgZ2xvYmFsX3R5cGVjaGFyY29tcG91bmQ9J0EnKzEsCiAgZ2xvYmFsX3R5cGVjaGFyY29tcG91bmQyPSdCJyA8PCAyCn07CmludCBnbG9iYWxEaWZmZXJlbnRUeXBlc1Rlc3QoaW50IG4pIHsgcmV0dXJuIG47IH0KfQolfQoKI2lmIGRlZmluZWQoU1dJR0NTSEFSUCkKJWNzY29uc3R2YWx1ZSgiMSIpIGdsb2JhbGVudW1jaGFyMTsKJWNzY29uc3R2YWx1ZSgiJ0InIikgZ2xvYmFsZW51bWNoYXJCOwolY3Njb25zdHZhbHVlKCIxIikgZW51bWNoYXIxOwolY3Njb25zdHZhbHVlKCInQiciKSBlbnVtY2hhckI7CiNlbmRpZgolaW5saW5lICV7CiNpZiBkZWZpbmVkKF9fY2xhbmdfXykKI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLy8gU3VwcHJlc3M6IGlsbGVnYWwgY2hhcmFjdGVyIGVuY29kaW5nIGluIGNoYXJhY3RlciBsaXRlcmFsCiNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2ludmFsaWQtc291cmNlLWVuY29kaW5nIgojZW5kaWYKCmVudW0gewogIGdsb2JhbGVudW1jaGFyMCA9ICdcMCcsCiAgZ2xvYmFsZW51bWNoYXIxID0gJ1wxJywKICBnbG9iYWxlbnVtY2hhcjIgPSAnXG4nLAogIGdsb2JhbGVudW1jaGFyQSA9ICdBJywKICBnbG9iYWxlbnVtY2hhckIgPSAnXDEwMicsIC8vIEIKICBnbG9iYWxlbnVtY2hhckMgPSAnXHg0MycsIC8vIEMKICBnbG9iYWxlbnVtY2hhckQgPSAweDQ0LCAvLyBECiAgZ2xvYmFsZW51bWNoYXJFID0gNjksICAvLyBFCiAgZ2xvYmFsZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICBnbG9iYWxlbnVtY2hhckFFMiA9ICdcMzA2JywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIGdsb2JhbGVudW1jaGFyQUUzID0gJ1x4QzYnIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKfTsKZW51bSBFbnVtQ2hhciB7CiAgZW51bWNoYXIwID0gJ1wwJywKICBlbnVtY2hhcjEgPSAnXDEnLAogIGVudW1jaGFyMiA9ICdcbicsCiAgZW51bWNoYXJBID0gJ0EnLAogIGVudW1jaGFyQiA9ICdcMTAyJywgLy8gQgogIGVudW1jaGFyQyA9ICdceDQzJywgLy8gQwogIGVudW1jaGFyRCA9IDB4NDQsIC8vIEQKICBlbnVtY2hhckUgPSA2OSwgLy8gRQogIGVudW1jaGFyQUUxID0gJ8YnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgZW51bWNoYXJBRTIgPSAnXDMwNicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICBlbnVtY2hhckFFMyA9ICdceEM2JyAvLyBBRSAobGF0aW4xIGVuY29kZWQpCn07CnN0cnVjdCBFbnVtQ2hhclN0cnVjdCB7CiAgZW51bSBFbnVtQ2hhciB7CiAgICBlbnVtY2hhcjAgPSAnXDAnLAogICAgZW51bWNoYXIxID0gJ1wxJywKICAgIGVudW1jaGFyMiA9ICdcbicsCiAgICBlbnVtY2hhckEgPSAnQScsCiAgICBlbnVtY2hhckIgPSAnXDEwMicsIC8vIEIKICAgIGVudW1jaGFyQyA9ICdceDQzJywgLy8gQwogICAgZW51bWNoYXJEID0gMHg0NCwgLy8gRAogICAgZW51bWNoYXJFID0gNjksIC8vIEUKICAgIGVudW1jaGFyQUUxID0gJ8YnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgICBlbnVtY2hhckFFMiA9ICdcMzA2JywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogICAgZW51bWNoYXJBRTMgPSAnXHhDNicgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIH07Cn07CiV9CgojaWYgZGVmaW5lZChTV0lHSkFWQSkKJWphdmFjb25zdCgwKTsKI2VsaWYgZGVmaW5lZChTV0lHQ1NIQVJQKQolY3Njb25zdCgwKTsKI2VuZGlmCgolaW5saW5lICV7CmVudW0gewogIHhfZ2xvYmFsZW51bWNoYXIwID0gJ1wwJywKICB4X2dsb2JhbGVudW1jaGFyMSA9ICdcMScsCiAgeF9nbG9iYWxlbnVtY2hhcjIgPSAnXG4nLAogIHhfZ2xvYmFsZW51bWNoYXJBID0gJ0EnLAogIHhfZ2xvYmFsZW51bWNoYXJCID0gJ1wxMDInLCAvLyBCCiAgeF9nbG9iYWxlbnVtY2hhckMgPSAnXHg0MycsIC8vIEMKICB4X2dsb2JhbGVudW1jaGFyRCA9IDB4NDQsIC8vIEQKICB4X2dsb2JhbGVudW1jaGFyRSA9IDY5LCAgLy8gRQogIHhfZ2xvYmFsZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICB4X2dsb2JhbGVudW1jaGFyQUUyID0gJ1wzMDYnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgeF9nbG9iYWxlbnVtY2hhckFFMyA9ICdceEM2JyAvLyBBRSAobGF0aW4xIGVuY29kZWQpCn07CmVudW0gWF9FbnVtQ2hhciB7CiAgeF9lbnVtY2hhcjAgPSAnXDAnLAogIHhfZW51bWNoYXIxID0gJ1wxJywKICB4X2VudW1jaGFyMiA9ICdcbicsCiAgeF9lbnVtY2hhckEgPSAnQScsCiAgeF9lbnVtY2hhckIgPSAnXDEwMicsIC8vIEIKICB4X2VudW1jaGFyQyA9ICdceDQzJywgLy8gQwogIHhfZW51bWNoYXJEID0gMHg0NCwgLy8gRAogIHhfZW51bWNoYXJFID0gNjksIC8vIEUKICB4X2VudW1jaGFyQUUxID0gJ8YnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgeF9lbnVtY2hhckFFMiA9ICdcMzA2JywgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQogIHhfZW51bWNoYXJBRTMgPSAnXHhDNicgLy8gQUUgKGxhdGluMSBlbmNvZGVkKQp9OwpzdHJ1Y3QgWF9FbnVtQ2hhclN0cnVjdCB7CiAgZW51bSBYX0VudW1DaGFyIHsKICAgIGVudW1jaGFyMCA9ICdcMCcsCiAgICBlbnVtY2hhcjEgPSAnXDEnLAogICAgZW51bWNoYXIyID0gJ1xuJywKICAgIGVudW1jaGFyQSA9ICdBJywKICAgIGVudW1jaGFyQiA9ICdcMTAyJywgLy8gQgogICAgZW51bWNoYXJDID0gJ1x4NDMnLCAvLyBDCiAgICBlbnVtY2hhckQgPSAweDQ0LCAvLyBECiAgICBlbnVtY2hhckUgPSA2OSwgLy8gRQogICAgZW51bWNoYXJBRTEgPSAnxicsIC8vIEFFIChsYXRpbjEgZW5jb2RlZCkKICAgIGVudW1jaGFyQUUyID0gJ1wzMDYnLCAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgICBlbnVtY2hhckFFMyA9ICdceEM2JyAvLyBBRSAobGF0aW4xIGVuY29kZWQpCiAgfTsKfTsKI2lmIGRlZmluZWQoX19jbGFuZ19fKQojcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiNlbmRpZgolfQoKJWlubGluZSAlewpuYW1lc3BhY2UgRGlmZmVyZW50U3BhY2UgewplbnVtIERpZmZlcmVudFR5cGVzTm9Db25zdCB7CiAgdHlwZWludF9ub2NvbnN0ID0gMTAsCiAgdHlwZWJvb2xmYWxzZV9ub2NvbnN0ID0gZmFsc2UsCiAgdHlwZWJvb2x0cnVlX25vY29uc3QgPSB0cnVlLAogIHR5cGVib29sdHdvX25vY29uc3QsCiAgdHlwZWNoYXJfbm9jb25zdCA9ICdDJywKICB0eXBlZGVmYXVsdGludF9ub2NvbnN0Cn07CgplbnVtIHsKICBnbG9iYWxfdHlwZWludF9ub2NvbnN0ID0gMTAsCiAgZ2xvYmFsX3R5cGVib29sZmFsc2Vfbm9jb25zdCA9IGZhbHNlLAogIGdsb2JhbF90eXBlYm9vbHRydWVfbm9jb25zdCA9IHRydWUsCiAgZ2xvYmFsX3R5cGVib29sdHdvX25vY29uc3QsCiAgZ2xvYmFsX3R5cGVjaGFyX25vY29uc3QgPSAnQycsCiAgZ2xvYmFsX3R5cGVkZWZhdWx0aW50X25vY29uc3QKfTsKfQolfQo=